First Missing Positive-计数排序/桶排序
2016-09-24 20:14
148 查看
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.
这题最主要的是要求时间复杂度为O(n),空间复杂度为O(1)。
刚开始想动态规划,没想出来,后来看网上说线性排序,看了别人的方法后才懂的。
关于线性排序,见链接:http://www.cnblogs.com/songlee/p/5738142.html http://book.51cto.com/art/201405/441260.htm
既然不能用额外空间,那就只有利用数组本身,跟Counting sort一样,利用数组的index来作为数字本身的索引,把正数按照递增顺序依次放到数组中。即让A[0]=1, A[1]=2, A[2]=3, ... , 这样一来,最后如果哪个数组元素违反了A[i]=i+1即说明i+1就是我们要求的第一个缺失的正数。对于那些不在范围内的数字,我们可以直接跳过,比如说负数,0,或者超过数组长度的正数,这些都不会是我们的答案。要注意的是,交换之后还需要判断交换来数字是否满足条件,不满足的话则继续交换。实 现中还需要注意一个细节,就是如果当前的数字所对应的下标已经是对应数字了,那么我们也需要跳过,因为那个位置的数字已经满足要求了,否则会出现一直来回
交换的死循环。http://www.cnblogs.com/ccsccs/articles/4216113.html
http://www.cnblogs.com/AnnieKim/archive/2013/04/21/3034631.html
代码如下:
class Solution {
public://
int firstMissingPositive(vector<int>& nums) {
int i, size = nums.size();
for(i = 0; i < size; ++i){
while(nums[i]!=i+1&&nums[i]>0&&nums[i]<size){
int temp = nums[i];
if(nums[temp-1]==temp)
nums[i] = -1;
else{
nums[i] = nums[temp-1];
nums[temp-1] = temp;
}
}
}
for(i = 0; i < size; ++i)
if(nums[i]!=i+1) break;
return i+1;
}
};
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.
这题最主要的是要求时间复杂度为O(n),空间复杂度为O(1)。
刚开始想动态规划,没想出来,后来看网上说线性排序,看了别人的方法后才懂的。
关于线性排序,见链接:http://www.cnblogs.com/songlee/p/5738142.html http://book.51cto.com/art/201405/441260.htm
既然不能用额外空间,那就只有利用数组本身,跟Counting sort一样,利用数组的index来作为数字本身的索引,把正数按照递增顺序依次放到数组中。即让A[0]=1, A[1]=2, A[2]=3, ... , 这样一来,最后如果哪个数组元素违反了A[i]=i+1即说明i+1就是我们要求的第一个缺失的正数。对于那些不在范围内的数字,我们可以直接跳过,比如说负数,0,或者超过数组长度的正数,这些都不会是我们的答案。要注意的是,交换之后还需要判断交换来数字是否满足条件,不满足的话则继续交换。实 现中还需要注意一个细节,就是如果当前的数字所对应的下标已经是对应数字了,那么我们也需要跳过,因为那个位置的数字已经满足要求了,否则会出现一直来回
交换的死循环。http://www.cnblogs.com/ccsccs/articles/4216113.html
http://www.cnblogs.com/AnnieKim/archive/2013/04/21/3034631.html
代码如下:
class Solution {
public://
int firstMissingPositive(vector<int>& nums) {
int i, size = nums.size();
for(i = 0; i < size; ++i){
while(nums[i]!=i+1&&nums[i]>0&&nums[i]<size){
int temp = nums[i];
if(nums[temp-1]==temp)
nums[i] = -1;
else{
nums[i] = nums[temp-1];
nums[temp-1] = temp;
}
}
}
for(i = 0; i < size; ++i)
if(nums[i]!=i+1) break;
return i+1;
}
};
相关文章推荐
- [Leetcode 96] 41 First Missing Positive
- Given an unsorted integer array, find the first missing positive integer.
- LeetCode-First Missing Positive
- First Missing Positive 找第一个没在array中出现的正数@LeetCode
- Leet Code 41 First Missing Positive - Java
- First Missing Positive
- First Missing Positive
- 想到这一点,只要10分钟不到 - First Missing Positive
- 【LeetCode练习题】First Missing Positive
- LeetCode First Missing Positive
- [leetcode]First Missing Positive
- First Missing Positive
- Leetcode: First Missing Positive
- 算法——First Missing Positive
- DAY28:leetcode #41 First Missing Positive
- LeetCode:First Missing Positive
- leetcode——First Missing Positive
- [leetcode]First Missing Positive
- LeetCode First Missing Positive
- [leetcode题后感]first missing positive