问题描述:
Given an array nums of n integers where nums[i] is in the range [1, n], return an array of all the integers in the range [1, n] that do not appear in nums.
限定条件:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
找丢失的元素,用hashset, 辅助数组很容易实现,但是要额外占用空间。这道题的挑战在于不用额外空间。
答案我没有先到,直到我看了答案。方法甚是巧妙,它巧妙地利用了所有数字的取值都在1-N这个条件,在原位不破坏原有信息的条件下,用符号标记数字的存在与否。
代码如下:
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> myList = new ArrayList<>();
for (int i=0; i<nums.length; i++){
if (nums[Math.abs(nums[i])-1]>0){
nums[Math.abs(nums[i])-1] = -(nums[Math.abs(nums[i])-1]);
}
}
for (int i=0; i<nums.length; i++){
if (nums[i]>0) {
myList.add(i+1);
}
}
return myList;
}
}
时间复杂度: O(n)