题目

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

样例

如果给出 [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. 新做的H5页面(具体应该说是百分比页面)

    主要代码 <div class="top" id="headTab"> <div id="photo"><a ...

  2. Android Error:You must supply a layout_width attribute……

    出现这种情况的可能原因目前本人碰到的有: 1:在xml文件中某个属性名或者属性值写错,请务必仔细检查你有没有写错某个拼写. 2:当你在,比如TextView中,没有声明layout_width,经测试 ...

  3. Linux环境下Python的安装过程

    Linux环境下Python的安装过程 前言 一般情况下,Linux都会预装 Python了,但是这个预装的Python版本一般都非常低,很多 Python的新特性都没有,必须重新安装新一点的版本,从 ...

  4. openerp 经典收藏 workflow中的‘非典型’自动触发器trigger_model(转载)

    workflow中的‘非典型’自动触发器trigger_model 原文:http://cn.openerp.cn/workflow%E4%B8%AD%E7%9A%84%E9%9D%9E%E5%85% ...

  5. CentOS 6.4 安装搭建 Scrapy 0.22 环境

    一.安装Python2.7.6 更新CentOS lib库文件 yum -y update 安装开发工具包 yum groupinstall -y development 安装扩展包 yum inst ...

  6. 【C#】索引器

    索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...

  7. Log4j配置和简单使用

    Log4j是一款基于Java的开源日志组件,Log4j功能非常强大,我们可以将日志信息输出到控制台.文件.用户界面,也可以输出到操作系统的事件记录器和一些系统常驻进程.更值得一提的是,Log4j可以允 ...

  8. iOS10 配置须知-b

    在iOS10中,如果你的App想要访问用户的相机.相册.麦克风.通讯录等等权限,都需要进行相关的配置,不然会直接crash.需要在info.plist中添加App需要的一些设备权限. NSBlueto ...

  9. android 设置半透明

    对于Button和ImageButton 还有一些View 设置半透明或者透明都是通过 android:background="#b0000000" 这是就是半透明 android ...

  10. JSON-JObject

    http://james.newtonking.com/json/help/index.html http://www.cnblogs.com/usharei/archive/2012/04/24/2 ...