lintcode:First Missing Positive 丢失的第一个正整数
题目
给出一个无序的整数数组,找出其中没有出现的最小正整数。
如果给出 [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)
- public class Solution {
- /**
- * @param A: an array of integers
- * @return: an integer
- */
- public int firstMissingPositive(int[] A) {
- // write your code here
- if(A.length ==0)
- return 1;
- // if(A.length ==1){
- // if(A[0]<= 0)
- // return 1;
- // return A[0]+1;
- // }
- // 1.找到正数的最小值
- // 2.最小值>1 return 1
- // 3.最小值<0 return 1
- // 4.最小值是1,最小值向上加 1 不存在的话就是答案
- int Min = Integer.MAX_VALUE;
- int MinInt = Integer.MAX_VALUE;
- ArrayList<Integer> list = new ArrayList<Integer>();
- for(int i=0;i< A.length;i++){
- if(A[i]>0){
- list.add(A[i]);
- if(A[i] < Min)
- Min = A[i];
- }
- }
- if(Min>1 )
- return 1;
- int i = 1;
- // 最小值等于 1
- while(i<= A.length){
- if(!list.contains(Min + i)){
- MinInt = Min + i;
- break;
- }
- i = i + 1;
- }
- return MinInt;
- }
- }
Java Code
总耗时: 2210 ms
这个和寻找缺失的数好像很像,虽然改写后的程序,理解不透,但是LeetCode的测试样例,造成无法通过
样例:[1,1]这样会陷入死循环。
程序如下
- public class Solution {
- /**
- * @param A: an array of integers
- * @return: an integer
- */
- public int firstMissingPositive(int[] A) {
- // write your code here
- if(A.length == 0)
- return 1;
- int n = A.length;
- for(int i =0 ;i< n ;i++){
- while(A[i] != i + 1){
- if(A[i] <= 0 || A[i] > n)
- break;
- int tmp = A[i];
- A[i] = A[tmp - 1];
- A[tmp - 1] = tmp;
- }
- }
- for(int i =0;i< n ;i++)
- if( A[i] != i+ 1)
- return i+1;
- return n + 1;
- }
- }
Java Code
- class Solution:
- # @param A, a list of integers
- # @return an integer
- def firstMissingPositive(self, A):
- # write your code here
- if A == None:
- return 1
- n = len(A)
- nums = A[:]
- for i in range(n):
- while A[i] != i+1:
- nums = A[:]
- if A[i]<=0 or A[i]>=n:
- break
- tmp = A[i]
- A[i] = A[tmp-1]
- A[tmp-1] = tmp
- # print 'before:',nums
- # print 'later:',A
- for i in range(n):
- if A[i]!= i +1:
- return i+1
- return n +1
Python Code
====更新
在LeetCode讨论中看到的程序
- public class Solution {
- /**
- * @param A: an array of integers
- * @return: an integer
- */
- public int firstMissingPositive(int[] A) {
- // write your code here
- //int[] A={2,1};
- if(A.length == 0)
- return 1;
- int n = A.length;
- for(int i = 0; i < n; ++ i){
- int digit = A[i];
- while(digit > 0 && digit <= n && A[digit - 1] != digit){
- int tmp = A[i];
- A[i] = A[digit -1];
- A[digit -1] =tmp;
- digit = A[i];
- }
- }
- for(int i = 0; i < n; ++ i)
- if(A[i] != i + 1)
- return i + 1;
- return n + 1;
- }
- }
这里的思想还是寻找缺失的数的思想
寻找缺失的数,原始序列是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
- class Solution:
- # @param A, a list of integers
- # @return an integer
- def firstMissingPositive(self, A):
- # write your code here
- if A == None:
- return 1
- n = len(A)
- nums = A[:]
- for i in range(n):
- digit = A[i]
- while digit>0 and digit<=n and A[digit -1] != digit:
- A[i],A[digit -1] = A[digit-1],A[i]
- digit = A[i]
- for i in range(n):
- if A[i]!= i +1:
- return i+1
- return n +1
说明:在交换的时候不用digit代替A[i] 交换无效。
lintcode:First Missing Positive 丢失的第一个正整数的更多相关文章
- [LeetCode] 41. First Missing Positive ☆☆☆☆☆(第一个丢失的正数)
Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...
- leetCode 41.First Missing Positive (第一个丢失的正数) 解题思路和方法
First Missing Positive Given an unsorted integer array, find the first missing positive integer. Fo ...
- LeetCode OJ:First Missing Positive (第一个丢失的正数)
在leetCode上做的第一个难度是hard的题,题目如下: Given an unsorted integer array, find the first missing positive inte ...
- [leetcode]41. First Missing Positive第一个未出现的正数
Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...
- [Swift]LeetCode41. 缺失的第一个正数 | First Missing Positive
Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...
- LeetCode题解41.First Missing Positive
41. First Missing Positive Given an unsorted integer array, find the first missing positive integer. ...
- LeetCode(41)First Missing Positive
题目 Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2 ...
- [LeetCode] First Missing Positive 首个缺失的正数
Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...
- Leetcode First Missing Positive
Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...
随机推荐
- android Timer and TImerTask
android Timer and TImerTask Caused by: java.lang.IllegalStateException: TimerTask is scheduled alrea ...
- win7局域网无法ping通本机的问题解决方法
对于window7系统,很多朋友会发现:默认下是不允许被ping的,其实都系统自带的防护墙所阻止了,新建一个策略就可以实现被ping通,如下操作
- 关于iOS6应用中第三方类库不支持armv7s的问题解决
今天编译ios6+cocos2d v2 .1 beta2制作的游戏,出现下面的错误: ld: file is universal (3 slices) but does not contain a(n ...
- 仿UC天气下拉和微信下拉眼睛头部淡入淡出--第三方开源--PullLayout
Android-PullLayout是github上的一个第三方开源项目,该项目主页是:https://github.com/BlueMor/Android-PullLayout 原作者项目意图实现类 ...
- Python-Day3 Python基础进阶之集和/文件读写/函数
一.集和 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 1.创建集合 >>> s ...
- BI的核心价值[转]
BI的核心价值是辅助决策,从一个洁净的数据源中自动提取有价值的数据进行分析,从而成为重要商业决定的决策基础.但在国内,洁净的数据源不易得到,很多情况下都需要进行数据清洗,所以BI的应用受到很大程度的抑 ...
- entityframwork
entityframwork映射部分: public class NorthwindContext : DbContext { public DbSet<CATEGORIES> Categ ...
- PHP获取mysql数据表的字段名称和详细信息的方法
首先我们需要了解下查询MySQL数据库/表相关信息的SQL语句: 代码如下: SHOW DATABASES //列出 MySQL Serv ...
- 关于6410的sd卡和nandflash启动的区别
今天在公司我们队长问我个问题,关于cortex的sd启动流程和nandflash的启动流程,一下想不起来了,中午闲来无事就整理了整理当初6410的两种启动方式的区别.在这里写一下.有不对的请指点,我对 ...
- S.O.L.I.D五大原则- 深入了解javascript
/* S.O.L.I.D五大原则 1. 单一原则 2. 开闭原则 3. 里氏替换原则 4. 接口分离原则 5. 依赖反转原则 */ /*单一原则:类发生更改的原因只有一个 如何知道一个对象的多个行为构 ...