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] ...
随机推荐
- git 的使用(4)-git暂缓区工作区原理和修改删除等命令
文章转载自:http://blog.csdn.net/think2me/article/details/39056379 博主说未经本人允许,不得转载,那就不贴了,拷贝关键部分作备忘 1. 暂存区是G ...
- Java内存溢出详解
转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap ...
- [转]Android在eclipse中的快捷键
1.选中你要加注释的区域,用ctrl+shift+C 会加上//注释2.先把你要注释的东西选中,用shit+ctrl+/ 会加上/* */注释3.要修改在eclispe中的命令的快捷键方式我们只 ...
- 【Qt】QDialog之屏蔽Esc键【转】
简述 Qt中Esc键会在一些控件中默认的进行一些事件的触发,比如:QDialog,按下Esc键窗口消失.大多数情况下,我们不需要这么做,那么就需要对默认事件进行屏蔽. 简述 源码分析 事件过滤器 事件 ...
- Hbase 0.98集群搭建的详细步骤
准备工作 Hbase的搭建是依赖于Hadoop的,Hbase的数据文件实际上存储在HDFS文件系统中,所以我们需要先搭建hadoop环境,之前的博文中已经搭建过了(详见http://www.cnblo ...
- http 错误编号大全(转)
状态行包含HTTP版本.状态代码.与状态代码对应的简短说明信息.在大多数情况下,除了Content-Type之外的所有应答头都是可选的.但Content-Type是必需的,它描述的是后面文档的MI ...
- Mac开发利器之程序员编辑器MacVim学习总结
Emacs和Vim都是程序员专用编辑器,Emacs被称为神的编辑器,Vim则是编辑器之神.至于两者到底哪个更好用,网络上两大派系至今还争论不休.不过,相比之下,Emacs更加复杂,已经不能算是一个编辑 ...
- SQLServer处理亿万级别的数据的优化措施
如何在SQLServer中处理亿万级别的数据(历史数据),可以按以下方面进行: 去掉表的所有索引 用SqlBulkCopy进行插入 分表或者分区,减少每个表的数据总量 在某个表完全写完之后再建立索引 ...
- Oracle 摘去数据块的面纱
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00018000h 6 A2 0 0 0c 0 80 3 8b 61 15 0 0 0 3 4 type frmt spa ...
- jar 命令打war包
假定有一个Web应用:C:\myHomemyHome/WEB-INF/……myHome/files/……myHome/image/……myHome/src/……myHome/index.jsp在命令行 ...