题解——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:
题目如上,简化后的题意如下:
给你一个整数数组,元素大小介于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,而那些不满足的元素即为出现两次的。
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,而那些不满足的元素即为出现两次的。
相关文章推荐
- 题解——Leetcode 12. Integer to Roman 难度:Medium
- 题解——Leetcode 5. Longest Palindromic Substring 难度:Medium
- LeetCode[127. Word Ladder] 题解 难度[medium]
- 题解——Leetcode 16. 3Sum Closest 难度:Medium
- 题解——Leetcode 526. Beautiful Arrangement 难度:Medium
- 题解——Leetcode 419. Battleships in a Board 难度:Medium
- 题解——Leetcode 2. Add Two Numbers 难度:Medium
- 题解——Leetcode 18. 4Sum 难度:Medium
- 题解——Leetcode 240. Search a 2D Matrix II 难度:Medium
- 题解——Leetcode 6. ZigZag Conversion 难度:Medium
- 题解——Leetcode 241. Different Ways to Add Parentheses 难度:Medium
- 题解——Leetcode 11.Container With Most Water 难度:Medium
- 题解——Leetcode 406. Queue Reconstruction by Height 难度:Medium
- 题解——Leetcode 529. Minesweeper 难度:Medium
- 题解——Leetcode 8. String to Integer (atoi) 难度:Medium
- 题解——Leetcode 419. Battleships in a Board 难度:Medium
- [leetcode]55. Jump Game ,C++/PYTHON实现,medium难度
- LeetCode[377. Combination Sum IV] 难度[medium]
- [leetcode]39. Combination Sum,python实现【Medium难度】
- 题解——Leetcode 17.Letter Combinations of a Phone Number 难度:Medium