题目

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

样例

如果给出 [1,2,0], return 3 如果给出 [3,4,-1,1], return 2

挑战

只允许时间复杂度O(n)的算法,并且只能使用常数级别的空间。

解题 

感觉好像好像很复杂,通过率21%也是比较低的了。

找了一个很不好的方法

步骤:

1.先找出数组中正整数的最小值,Min

2.若Min>1 显然最小的不在数组中的正整数就是1

3.这里的都是最小值Min == 1的情况

对于这个情况,只需要判断  对最小的i, Min + i 是否在数组中的正整数部分,这里需要定义一个ArrayList存放正整数部分的数,方便判断Min+i是否在ArrayList中。最小的i对于的Min+i就是答案。

这里时间复杂度和空间复杂度都是O(N)

  1. public class Solution {
  2. /**
  3. * @param A: an array of integers
  4. * @return: an integer
  5. */
  6. public int firstMissingPositive(int[] A) {
  7. // write your code here
  8. if(A.length ==0)
  9. return 1;
  10. // if(A.length ==1){
  11. // if(A[0]<= 0)
  12. // return 1;
  13. // return A[0]+1;
  14. // }
  15. // 1.找到正数的最小值
  16. // 2.最小值>1 return 1
  17. // 3.最小值<0 return 1
  18. // 4.最小值是1,最小值向上加 1 不存在的话就是答案
  19. int Min = Integer.MAX_VALUE;
  20. int MinInt = Integer.MAX_VALUE;
  21. ArrayList<Integer> list = new ArrayList<Integer>();
  22. for(int i=0;i< A.length;i++){
  23. if(A[i]>0){
  24. list.add(A[i]);
  25. if(A[i] < Min)
  26. Min = A[i];
  27. }
  28. }
  29. if(Min>1 )
  30. return 1;
  31. int i = 1;
  32. // 最小值等于 1
  33. while(i<= A.length){
  34. if(!list.contains(Min + i)){
  35. MinInt = Min + i;
  36. break;
  37. }
  38. i = i + 1;
  39. }
  40. return MinInt;
  41. }
  42. }

Java Code

总耗时: 2210 ms

这个和寻找缺失的数好像很像,虽然改写后的程序,理解不透,但是LeetCode的测试样例,造成无法通过

样例:[1,1]这样会陷入死循环。

程序如下

  1. public class Solution {
  2. /**
  3. * @param A: an array of integers
  4. * @return: an integer
  5. */
  6. public int firstMissingPositive(int[] A) {
  7. // write your code here
  8. if(A.length == 0)
  9. return 1;
  10. int n = A.length;
  11. for(int i =0 ;i< n ;i++){
  12. while(A[i] != i + 1){
  13. if(A[i] <= 0 || A[i] > n)
  14. break;
  15. int tmp = A[i];
  16. A[i] = A[tmp - 1];
  17. A[tmp - 1] = tmp;
  18. }
  19. }
  20. for(int i =0;i< n ;i++)
  21. if( A[i] != i+ 1)
  22. return i+1;
  23. return n + 1;
  24. }
  25. }

Java Code

  1. class Solution:
  2. # @param A, a list of integers
  3. # @return an integer
  4. def firstMissingPositive(self, A):
  5. # write your code here
  6. if A == None:
  7. return 1
  8. n = len(A)
  9. nums = A[:]
  10. for i in range(n):
  11. while A[i] != i+1:
  12. nums = A[:]
  13. if A[i]<=0 or A[i]>=n:
  14. break
  15. tmp = A[i]
  16. A[i] = A[tmp-1]
  17. A[tmp-1] = tmp
  18. # print 'before:',nums
  19. # print 'later:',A
  20. for i in range(n):
  21. if A[i]!= i +1:
  22. return i+1
  23. return n +1

Python Code

====更新

在LeetCode讨论中看到的程序

  1. public class Solution {
  2. /**
  3. * @param A: an array of integers
  4. * @return: an integer
  5. */
  6. public int firstMissingPositive(int[] A) {
  7. // write your code here
  8. //int[] A={2,1};
  9. if(A.length == 0)
  10. return 1;
  11. int n = A.length;
  12. for(int i = 0; i < n; ++ i){
  13. int digit = A[i];
  14. while(digit > 0 && digit <= n && A[digit - 1] != digit){
  15. int tmp = A[i];
  16. A[i] = A[digit -1];
  17. A[digit -1] =tmp;
  18. digit = A[i];
  19. }
  20.  
  21. }
  22.  
  23. for(int i = 0; i < n; ++ i)
  24. if(A[i] != i + 1)
  25. return i + 1;
  26.  
  27. return n + 1;
  28. }
  29. }

这里的思想还是寻找缺失的数的思想

寻找缺失的数,原始序列是0 -N的,找出其中缺失的说,所以0是序列中的数,或者说0可能是答案

而这个题目是寻找第一个缺失的正整数,这里0不是答案,所以还要增加判断:A[A[i] - 1] !=A[i]

换个角度说就是让数组排序后是 1 2 3 4 的样式,第0个位置 应该是1 ,第1个位置应该是 2,第i个位置应该是i+1

对[3,4,-1,1]

第0个位置A[2]!=A[0] 交换后 :[-1,4,3,1]

第0个位置A[0]<0 跳出

第1个位置A[3]!=A[1]交换后:[-1,1,3,4]

第1个位置A[0]!=A[1]交换后:[1,-1,3,4]

第1个位置A[1]<0跳出

第2个位置A[2]==A[2]跳出

第3个位置A[3]==A[3]跳出

下面判断A[i] 是否等于i+1,第一个不满足条件的就是答案,i+1是答案,当都满足的时候就是n+1

Python

  1. class Solution:
  2. # @param A, a list of integers
  3. # @return an integer
  4. def firstMissingPositive(self, A):
  5. # write your code here
  6. if A == None:
  7. return 1
  8. n = len(A)
  9. nums = A[:]
  10. for i in range(n):
  11. digit = A[i]
  12. while digit>0 and digit<=n and A[digit -1] != digit:
  13. A[i],A[digit -1] = A[digit-1],A[i]
  14. digit = A[i]
  15. for i in range(n):
  16. if A[i]!= i +1:
  17. return i+1
  18. return n +1

说明:在交换的时候不用digit代替A[i] 交换无效。

lintcode:First Missing Positive 丢失的第一个正整数的更多相关文章

  1. [LeetCode] 41. First Missing Positive ☆☆☆☆☆(第一个丢失的正数)

    Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...

  2. leetCode 41.First Missing Positive (第一个丢失的正数) 解题思路和方法

    First Missing Positive  Given an unsorted integer array, find the first missing positive integer. Fo ...

  3. LeetCode OJ:First Missing Positive (第一个丢失的正数)

    在leetCode上做的第一个难度是hard的题,题目如下: Given an unsorted integer array, find the first missing positive inte ...

  4. [leetcode]41. First Missing Positive第一个未出现的正数

    Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...

  5. [Swift]LeetCode41. 缺失的第一个正数 | First Missing Positive

    Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...

  6. LeetCode题解41.First Missing Positive

    41. First Missing Positive Given an unsorted integer array, find the first missing positive integer. ...

  7. LeetCode(41)First Missing Positive

    题目 Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2 ...

  8. [LeetCode] First Missing Positive 首个缺失的正数

    Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0]  ...

  9. Leetcode First Missing Positive

    Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0]  ...

随机推荐

  1. android Timer and TImerTask

    android Timer and TImerTask Caused by: java.lang.IllegalStateException: TimerTask is scheduled alrea ...

  2. win7局域网无法ping通本机的问题解决方法

    对于window7系统,很多朋友会发现:默认下是不允许被ping的,其实都系统自带的防护墙所阻止了,新建一个策略就可以实现被ping通,如下操作

  3. 关于iOS6应用中第三方类库不支持armv7s的问题解决

    今天编译ios6+cocos2d v2 .1 beta2制作的游戏,出现下面的错误: ld: file is universal (3 slices) but does not contain a(n ...

  4. 仿UC天气下拉和微信下拉眼睛头部淡入淡出--第三方开源--PullLayout

    Android-PullLayout是github上的一个第三方开源项目,该项目主页是:https://github.com/BlueMor/Android-PullLayout 原作者项目意图实现类 ...

  5. Python-Day3 Python基础进阶之集和/文件读写/函数

    一.集和 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 1.创建集合 >>> s ...

  6. BI的核心价值[转]

    BI的核心价值是辅助决策,从一个洁净的数据源中自动提取有价值的数据进行分析,从而成为重要商业决定的决策基础.但在国内,洁净的数据源不易得到,很多情况下都需要进行数据清洗,所以BI的应用受到很大程度的抑 ...

  7. entityframwork

    entityframwork映射部分: public class NorthwindContext : DbContext { public DbSet<CATEGORIES> Categ ...

  8. PHP获取mysql数据表的字段名称和详细信息的方法

    首先我们需要了解下查询MySQL数据库/表相关信息的SQL语句: 代码如下: SHOW DATABASES                                //列出 MySQL Serv ...

  9. 关于6410的sd卡和nandflash启动的区别

    今天在公司我们队长问我个问题,关于cortex的sd启动流程和nandflash的启动流程,一下想不起来了,中午闲来无事就整理了整理当初6410的两种启动方式的区别.在这里写一下.有不对的请指点,我对 ...

  10. S.O.L.I.D五大原则- 深入了解javascript

    /* S.O.L.I.D五大原则 1. 单一原则 2. 开闭原则 3. 里氏替换原则 4. 接口分离原则 5. 依赖反转原则 */ /*单一原则:类发生更改的原因只有一个 如何知道一个对象的多个行为构 ...