寻找不在数组中最小的正整数 First Missing Positive
2014-03-08 20:14
399 查看
问题:给出一个无序的数组,其中包含有任意的整数。现在要求返回不包含在数组中的最小的正整数。
要求:时间复杂度O(n),空间复杂度O(1)。
思路:如果不要求空间复杂度,可以用hash、map进行统计。但是现在,不允许借助临时空间。但是对于无序数组,不借助空间怎么可能统计的出来。
方法一:把输入数组自己作为临时空间使用。
这一方法用了一个类似计数排序的技巧。把数组下标看作一个数的hash值,把一个正数是否存在这一信息存储在该正数值对应的下标位置里。但是不能够覆盖掉数组本身的数据,所以利用负号这一标志来代表该位置所对应下标数值的存在性。利用这个方法,就能够做到把数组本身作为自己的hash表。
在这么做之前,要先数组中没有用的负数移到数组最左边去。
方法二:利用桶排序的思想。将正整数放在对应的下标位置上。1放在A[0],2放在A[1]……由于不能用辅助空间,所以需要交换来完成放置。对于一个元素数值A[i],如果0<A[i]<n,那么它的最终位置应该是A[A[i]-1],因此交换A[i],A[A[i]-1]即可;如果不是正整数或是超过数组下标范围,那么就没有可放置的最终位置(这个数也必然不会是最终要找的数)。
要求:时间复杂度O(n),空间复杂度O(1)。
思路:如果不要求空间复杂度,可以用hash、map进行统计。但是现在,不允许借助临时空间。但是对于无序数组,不借助空间怎么可能统计的出来。
方法一:把输入数组自己作为临时空间使用。
这一方法用了一个类似计数排序的技巧。把数组下标看作一个数的hash值,把一个正数是否存在这一信息存储在该正数值对应的下标位置里。但是不能够覆盖掉数组本身的数据,所以利用负号这一标志来代表该位置所对应下标数值的存在性。利用这个方法,就能够做到把数组本身作为自己的hash表。
在这么做之前,要先数组中没有用的负数移到数组最左边去。
class Solution { public: int firstMissingPositive(int A[], int n) { if(n == 0) return 1; int k = seperate(A, n); //A[0..k] if(k == -1) return 1; //mark the index for(int i=0;i<=k;i++) { int value = abs(A[i]); if(value > k+1) continue; A[value-1] = - abs(A[value-1]); //防止重复取反导致记录错误 } for(int i=0;i<=k;i++) { if(A[i] > 0) return i+1; } return k+2; } int seperate(int A[], int n) //返回正数序列的末尾坐标 { int left = 0, right = n-1; while(left < right) { while(left < right && A[left] > 0) left++; while(left < right && A[right] <=0) right--; if(left < right) swap(A[left], A[right]); } if(A[left] > 0) return left; else return left-1; } void swap(int &a, int &b) { a = a^b; b = a^b; a = a^b; } };
方法二:利用桶排序的思想。将正整数放在对应的下标位置上。1放在A[0],2放在A[1]……由于不能用辅助空间,所以需要交换来完成放置。对于一个元素数值A[i],如果0<A[i]<n,那么它的最终位置应该是A[A[i]-1],因此交换A[i],A[A[i]-1]即可;如果不是正整数或是超过数组下标范围,那么就没有可放置的最终位置(这个数也必然不会是最终要找的数)。
class Solution { public: int firstMissingPositive(int A[], int n) { bucket(A, n); for(int i=0;i<n;i++) if(A[i] != i+1) return i+1; return n+1; } void bucket(int A[], int n) { for(int i=0;i<n;i++) while(A[i] != i+1) { if(A[i] <= 0 || A[i] > n || A[i] == A[A[i]-1]) break; swap(A[i], A[A[i]-1]); } } };
相关文章推荐
- [LeetCode(Q41)] First Missing Positive (乱序数组中寻找第一个未出现的正整数)
- [LeetCode(Q41)] First Missing Positive (乱序数组中寻找第一个未出现的正整数)
- First Missing Positive(在数组中找到第一个丢失的正整数)
- 找到数组中第一个不见的正整数(First Missing Positive )
- 排序、数组——数组中重复的数字和first missing positive(桶排序)
- 定义一个由整数组成的数组,然后输入一个整数X,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j
- 【数组】First Missing Positive
- 整数数组的定义,然后输入一个整数X,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j
- 寻找数组中缺少的整数(Find the missing integer)
- leetcode---first-missing-positive---数组
- 数组:Remove Element&Merge Sorted Array&First Missing Positive
- LintCode : 第一个丢失的正整数 First Missing Positive
- LeetCode 41 First Missing Positive(找到数组中第一个丢失的正数)
- LeetCode | First Missing Positive(第一个缺失的正整数)
- LeetCode--First Missing Positive (第一个丢失的正整数)Python
- 寻找失踪的整数数组(Find the missing integer)
- First Missing Positive (寻找第一个丢失的正数)【leetcode】
- 数组代码First Missing Positive
- [LeetCode] 找到第一个不存在的正整数 First Missing Positive
- LeetCode:First Missing Positive