您的位置:首页 > 移动开发

leetcode 448 Find All Numbers Disappeared in an Array

2017-01-25 02:49 399 查看
Problem:

给一个数组,数组中包含大小为1~n(数组的大小)的数,问有哪一个数没有包含到当中?

Solution:

先把所有的数放在应该有的位置上,然后再遍历一次看谁的位置上不是它应有的数。

//Solution1:
//将负数当做一个标志位,这样可以只遍历两次,不需要一条龙式的遍历。
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> ret;

for(int i = 0; i < nums.size(); i++) {
int val = abs(nums[i]) - 1;
if(nums[val] > 0) {
nums[val] = -nums[val];
}
}

for(int i = 0; i < nums.size(); i++) {
if(nums[i] > 0) {
ret.push_back(i+1);
}
}
return ret;
}
};
//Solution2:
//将大于n当做标志位,计算每一位时通过取余恢复
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> ret;

int n = nums.size();
for (int i = 0; i < nums.size(); i++)
nums[(nums[i]-1) % n] += n;
for (int i = 0; i < nums.size(); i++)
if(nums[i] <= n)
ret.push_back(i+1);

return ret;
}
};
//Solution3:
//通过观察每一位是否是原来的值当做标志位
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> l;
int tmp = -1;
for(int i = 0; i < nums.size(); i++) {
while(nums[i] != i+1) {
if(nums[i] == tmp) {
tmp = -1;
break;
}
else {
tmp = nums[i];
nums[i] = nums[nums[i]-1];
nums[tmp-1] = tmp;
}
}
}
for(int i = 0; i < nums.size(); i++) {
if(nums[i] != i+1)
l.push_back(i+1);
}
return l;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: