Title:Find All Numbers Disappeared in an Array) 448
Difficulty:Easy
原题leetcode地址:https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/
1. 见代码中的注释讲解
时间复杂度:O(n),两次for循环,但都是一层,最长的for循环需要遍历整个数组的长度。
空间复杂度:O(1),没有申请额外。
/**
* 第一次for循环数组中每个元素对应的位置加(nums的长度+1),
* 没有出现的数对应的位置上的数不会加(nums的长度+1)
* 重复出现的数对应的位置上的数会加上(nums的长度+1)的次数就是出现的次数(如果求重复出现的数的次数就是...)
* 第二次for循环,将第一次for循环之后的数整除(nums的长度+1),
* 如果结果为0,则是没有出现的数
* 如果结果为1,则是出现一次的数
* 如果结果为2,则是出现两次的数,依次类推
* @param nums
* @return
*/
public static List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
nums[nums[i] % (nums.length + 1) - 1] += nums.length + 1;
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] % (nums.length + 1) == 0) {
list.add(i + 1);
}
}
return list;
}