解题代码:LeetCode/src/shuZu/_448_找到所有数组中消失的数字.java · HuaCai/Algorithm - 码云 - 开源中国 (gitee.com)
题目描述:给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1:
输入: nums = [4,3,2,7,8,2,3,1]
输出: [5,6]
示例 2:
输入: nums = [1,1]
输出: [2]
以上来源:力扣(LeetCode)
解题思路:利用哈希表进行检索,判断1~n中的数是否3全部出现
解题代码如下:
class Solution448 {
public List<Integer> findDisappearedNumbers(int[] nums) {
int n = nums.length;
for (int num : nums) {
int location = (num - 1) % n;// 找到这个元素值所对应的位置。
// 例如有17个元素,第一个元素是12,那么它对应的数组下标就是11,
// 加n操作后,第七个元素由9变成了26,那么它对应的数组下标就是(26-1)%17=8;
nums[location] += n;
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
if (nums[i] <= n) {
// 判断条件中为什么有等于号?(边界情况)
// 当 nums[i]=nums.length 且 i+1 是其中一个未出现的数时,等号就起了作用;
// 否则找到的未出现的数不全
list.add(i + 1);
}
}
return list;
}
}
时间复杂度:O(n);空间复杂度:O(1)。