【Leetcode】First Missing Positive
2015-08-24 23:21
375 查看
【题目】
Given an unsorted
integer array, find the first missing positive integer.
For example,
Given
and
Your algorithm should run in O(n) time and uses
constant space.
【分析】
重点是unsorted, 然后是运算复杂度是O(n),所以就不能用Arrays,sort, 因为O(nlgn);
虽然不能再另外开辟非常数级的额外空间,但是可以在输入数组上就地进行swap操作。
思路:交换数组元素,使得数组中第i位存放数值(i+1)。最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程需要遍历两次数组,复杂度为O(n)。
下图以题目中给出的第二个例子为例,讲解操作过程。
n个元素的数组,里面的数都是0~n-1范围内的,求数组中重复的某一个元素,没有返回-1, 要求时间性能O(n) 空间性能O(1)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for(int i=0; i<nums.size(); i++){
if(i+1==nums[i]) continue;
int x = nums[i];
while(x>=1 && x<=nums.size() && x!=nums[x-1]){
swap(x, nums[x-1]);
}
}
for(int i=0; i<nums.size(); i++){
if(i+1!=nums[i]) return i+1;
}
return nums.size()+1;
}
};
hashSet:
public int firstMissingPositive(int[] nums) {
if(nums.length==0) return 1;
HashSet<Integer> s = new HashSet<Integer>();
for(int a: nums){
s.add(a);
}
int num=0;
for(int i=1;i<=nums.length;i++){
if(!s.contains(i)){
return i;
}
num = i;
}
return num+1;
}
Given an unsorted
integer array, find the first missing positive integer.
For example,
Given
[1,2,0]return
3,
and
[3,4,-1,1]return
2.
Your algorithm should run in O(n) time and uses
constant space.
【分析】
重点是unsorted, 然后是运算复杂度是O(n),所以就不能用Arrays,sort, 因为O(nlgn);
虽然不能再另外开辟非常数级的额外空间,但是可以在输入数组上就地进行swap操作。
思路:交换数组元素,使得数组中第i位存放数值(i+1)。最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程需要遍历两次数组,复杂度为O(n)。
下图以题目中给出的第二个例子为例,讲解操作过程。
n个元素的数组,里面的数都是0~n-1范围内的,求数组中重复的某一个元素,没有返回-1, 要求时间性能O(n) 空间性能O(1)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for(int i=0; i<nums.size(); i++){
if(i+1==nums[i]) continue;
int x = nums[i];
while(x>=1 && x<=nums.size() && x!=nums[x-1]){
swap(x, nums[x-1]);
}
}
for(int i=0; i<nums.size(); i++){
if(i+1!=nums[i]) return i+1;
}
return nums.size()+1;
}
};
public int firstMissingPositive(int[] A) { int i = 0; while(i < A.length){ if(A[i] == i+1 || A[i] <= 0 || A[i] > A.length) i++; else if(A[A[i]-1] != A[i]) swap(A, i, A[i]-1); else i++; } i = 0; while(i < A.length && A[i] == i+1) i++; return i+1; } private void swap(int[] A, int i, int j){ int temp = A[i]; A[i] = A[j]; A[j] = temp; }
hashSet:
public int firstMissingPositive(int[] nums) {
if(nums.length==0) return 1;
HashSet<Integer> s = new HashSet<Integer>();
for(int a: nums){
s.add(a);
}
int num=0;
for(int i=1;i<=nums.length;i++){
if(!s.contains(i)){
return i;
}
num = i;
}
return num+1;
}
相关文章推荐
- hdu 4185 Oil Skimming 二分图匹配
- prototype原型
- Android 的上下文菜单: Context Menu,registerForContextMenu(getListView())
- UVA10087 Concatenation of Languages(字符hash)
- Hystrix提高系统可用性
- CCF 窗口
- C语言基础--数组及相关
- ASCII
- 基于opencv的神经网络算法实现两类分类问题的可视化演示
- Introduction to Java Programming编程题9.7<将字符串中的字符转换为数字>
- C/C++中extern关键字详解
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第三 四条
- sql中的函数
- MySQL 插入数据时,中文乱码问题的解决
- 静态链接库LIB和动态链接库DLL的区别
- Aapache: You don't have permission to access / on this server.错误
- 《HTTP权威指南》阅读笔记(三)
- HDFS源码分析(五)-----节点注册与心跳机制
- Object -C NSNumber -- 笔记
- linux+tomcat+mysql相关命令