您的位置:首页 > 其它

题解——Leetcode 442. Find All Duplicates in an Array 难度:Medium

2017-03-06 11:49 501 查看
Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear
twice and others appear once.

Find all the elements that appear twice in this array.

Could you do it without extra space and in O(n) runtime?

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[2,3]


题目如上,简化后的题意如下:

给你一个整数数组,元素大小介于1和数组大小n之间,有些元素会出现两次而其他元素只出现一次。如何在O(n)的时间复杂度以及不占用额外内存的条件下找出所有出现两次的元素。

C++程序如下:

class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
int i = 0;
while(i < nums.size()){
if(nums[i] != nums[nums[i] - 1])
swap(nums[i], nums[nums[i] - 1]);
else
i++;
}
for(int i = 0; i < nums.size(); i++)
if(i != nums[i]-1)
res.push_back(nums[i]);

return res;
}
};

解题的关键在于元素大小介于1和n之间,如果我们将所有元素从小到大排列,假设所有元素都只出现一次,那么nums[i]=i+1,但由于有重复出现的元素,所以那些nums[i]-1!=i的元素即为重复元素。
但题目还有另一个要求,时间复杂度为O(n),常规排序是达不到的。本题对数组元素挨个判断是否满足nums[i]=i+1,如果不满足,将nums[i]置换到对应位置上即nums[nums[i]-1],这样的话下标为nums[i]-1的元素就满足了条件,但交换后下标为i的元素不一定满足,但只要重复交换一定的次数,总会满足条件。所以经过对每个元素的交换操作,只出现一次的元素都满足了nums[i]=i+1,而那些不满足的元素即为出现两次的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: