zoukankan      html  css  js  c++  java
  • 41. First Missing Positive (HashTable)

    Given an unsorted integer array, find the first missing positive integer.

    For example,
    Given [1,2,0] return 3,
    and [3,4,-1,1] return 2.

    Your algorithm should run in O(n) time and uses constant space.

    思路:n个数,可能的最大正整数是n,所以可以将这n个数作为哈希值。但是这样要有O(n)的额外空间。

    解决方法是复用A[], 首先将A[i]中的负数剔出(标记为n+1);第二次遍历时,将<=n的正整数交换到下标为n-1的位置。

    class Solution {
    public:
        int firstMissingPositive(vector<int>& nums) {
            int size = nums.size();
            int tmp,i;
            for(i =0; i < size; i++){
                if(nums[i]<=0) nums[i]=size+1;
            }
            
            i = 0;
            while(i < size){
                if(nums[i]<=size && nums[i]!=i+1){
                    if(nums[nums[i]-1]==nums[i]){//repeat digit occurs
                        nums[i]=size+1;
                        i++;
                    }
                    else{
                        tmp=nums[nums[i]-1];
                        nums[nums[i]-1]=nums[i];
                        nums[i]=tmp;
                    }
                }
                else{
                    i++;
                }
            }
        
            for(int i = 0; i < size; i++){
                if(nums[i]!=i+1){
                    if(i>0) return nums[i-1]+1;
                    else return 1;
                }
            }
            return size+1;
        }
    };

    改进: 我们可以不用tmp进行交换,省去O(1)的空间,也减少赋值的次数。当遍历到一个整数cur的时候,将A[cur]变成相反数,这样A[i]<0的i位置表示i出现过了,还保证了A[i]原来的值没被破坏(可以通过abs(A[i])获得)。

    class Solution {
    public:
        int firstMissingPositive(int A[], int n) {
            int i;
            for (i = 0; i < n; i++)
                if(A[i]<=0) A[i] = n+1;
            for (i = 0; i < n; i++) {
                if(abs(A[i]) <= n ){ //需要abs,因为在for循环中,我们将值为[1,n]的元素改成了负数
                    int cur = abs(A[i])-1;
                    A[cur] = -abs(A[cur]);
                }
            }
            for (i = 0; i < n; i++) {
                if (A[i] > 0) return i+1;
            }
            return n+1;
        }
    };
  • 相关阅读:
    CF1391D 【505】
    CF1389C 【Good String】
    CF1364C 【Ehab and Prefix MEXs】
    CF1353E 【K-periodic Garland】
    CF1349A 【Orac and LCM】
    CF1352C 【K-th Not Divisible by n】
    CF413D 【2048】
    CF257B 【Playing Cubes】
    CF267A 【Subtractions】
    2018.8.16提高B组模拟考试
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4854945.html
Copyright © 2011-2022 走看看