zoukankan      html  css  js  c++  java
  • 41. 缺失的第一个正数

    给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

    提示:

    你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。

    class Solution {
        private void swap(int[] nums,int i, int k){
            int temp = nums[i];
            nums[i] = nums[k];
            nums[k] = temp;
        }
        public int firstMissingPositive(int[] nums) {
            //方法1,先排序,再用二分法,时间复杂度O(nlogn)空间复杂度O(1)
            //方法2,把无序数组存入哈希表,然后在遍历哈希表。时间复杂度O(n),空间复杂度O(n)
            //方法3,原地哈希法,把i个元素放在第nums[i]-1个位置上,再遍历一遍找到缺失的数字
            int len = nums.length;
            for(int i=0;i<len;i++){//nums[nums[i]-1]查看第i个元素的值是否放正确
                while(nums[i]<len&&nums[i]>0&&nums[i]!=nums[nums[i]-1]){
                    //当前数>0才需要排序,<len才可以放进当前的数组中,此处用while复杂度不会高,因为均摊复杂度
                    //swap交换i个元素放在第nums[i]-1个位置上,此时需要再次比对
                    //当前i个位置交换后的数是否正确,如果不对需要重复
                    swap(nums,i,nums[i]-1);
                }
            }
            for(int j=0;j<len;j++){
                if(j+1!=nums[j]){
                    return j+1;
                }
            }
            //全都遍历没有问题那么缺失的数字为当前数组最大的数len+1;
            return len+1;
        }
    }
    
  • 相关阅读:
    前端JavaScript之DOM节点操作
    前端JavaScript之DOM事件操作
    前端JavaScript之ECMA
    前端css小米导航栏设置及盒子定位居中问题
    Go:条件语句、循环语句
    Go:值类型、引用类型
    Go:字符串操作
    Go:变量、常量、枚举
    type、object、class之间的关系
    二叉树
  • 原文地址:https://www.cnblogs.com/ScarecrowAnBird/p/13047828.html
Copyright © 2011-2022 走看看