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;
        }
    };
  • 相关阅读:
    软工随堂小测——四则运算
    K米测评
    uml用例图
    第二次结对编程作业——毕设导师智能匹配
    原型设计与需求分析
    散列函数的应用及其安全性
    Think In Java读书笔记:内部类覆盖及其初始化
    如何在服务器(centOS系统)上运行JavaWeb项目
    结对工程作业
    《构建之法》——第四、第十七章
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4854945.html
Copyright © 2011-2022 走看看