Easy
1875175FavoriteShare
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements of [1, n] inclusive that do not appear in this array.
Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
Example:
Input:
[4,3,2,7,8,2,3,1]
Output:
[5,6]
Hash表法:
Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
* @Autor: SourDumplings
* @Date: 2019-09-25 22:43:43
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/
*
* 利用哈希表,时间和空间复杂度O(n)
*/
class Solution
{
public List<Integer> findDisappearedNumbers(int[] nums)
{
List<Integer> res = new ArrayList<>();
int n = nums.length;
boolean[] h = new boolean[n];
Arrays.fill(h, false);
for (int i : nums)
{
h[i - 1] = true;
}
for (int i = 0; i < n; i++)
{
if (!h[i])
{
res.add(i + 1);
}
}
return res;
}
}
归位法:
C++:
/*
* @Autor: SourDumplings
* @Date: 2019-09-25 22:18:28
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/
*
* 该方法的思想是把各个元素放在其改在的位置上,时间复杂度O(n),空间复杂度O(1)
*/
class Solution
{
public:
vector<int> findDisappearedNumbers(vector<int> &nums)
{
int n = nums.size();
for (int i = 0; i < n; i++)
{
int temp = nums[i];
if (temp != i + 1 && nums[temp - 1] != temp)
{
swap(nums[i], nums[temp - 1]);
if (nums[i] != i + 1)
{
--i;
}
}
}
int d = 1;
vector<int> res;
for (auto &&i : nums)
{
if (i != d)
{
res.push_back(d);
}
++d;
}
return res;
}
};