1、
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
First Missing Positive
Missing Number
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n
, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3]
return 2
.
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
思路:
1:求出1,2......n的数列之和total。
2:计算数组所有元素的和sum。
3:total - sum的值,就是所求缺失的数。
代码:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
int total = n * (n + 1) / 2;
int sum = 0;
for(int i = 0; i < n; i ++)
{
sum += nums[i];
}
return total - sum;
}
};
First Missing Positive
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
.
思路:
虽然不能再另外开辟非常数级的额外空间,但是可以在输入数组上就地进行swap操作。
思路:交换数组元素,使得数组中第i位存放数值(i+1)。最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程需要遍历两次数组,复杂度为O(n)。
下图以题目中给出的第二个例子为例,讲解操作过程。
![](http://images.cnitblog.com/blog/300640/201304/21220310-d1b03fc59dd24e82b6db34a2cae12111.jpg)
代码:
class Solution {
public:
void swap(vector<int>& nums, int a, int b)
{
int tmp = nums[a];
nums[a] = nums[b];
nums[b] = tmp;
}
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
int pos = 0;
while(pos < n)
{
int num = nums[pos];
if(num < n && num > 0 && num != nums[num - 1])
{
swap(nums, pos, num - 1);
}
else
pos ++;
}
for(int i = 0; i < n; i ++)
{
int num = nums[i];
if(num != i + 1)
return i + 1;
}
return n + 1;
}
};