持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
一、题目描述:
448. 找到所有数组中消失的数字 - 力扣(LeetCode)
给你一个含
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]
提示:
- n == nums.length
- 1 <= n <= 10^5
- 1 <= nums[i] <= n
进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
二、思路分析:
转换思路: 其实就是判断 数组当中是否存在 index+1 的数字 列如索引 i 那么是否存在 i+1 数字
那么说明 数组元素 其实也就是 索引 那么通过 元素 % length 就可以得到一个 < length 的索引 标记出出现的索引,然后遍历数组即可,为标记的 就是消失元素
三、AC 代码:
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
// 数据包含 1-n范围
List<Integer> list=new ArrayList();
int len=nums.length;
//取模大法,直接修改原始数组
//将存在的元素+len
for(int n : nums){
int r=(n-1)%len;
nums[r]+=len;
}
//将正确结果放入结果空间
for(int i=0;i<len;i++){
// 比存在的 + len 了,那么比length小的一定就是不存在的
if(nums[i]<=len)list.add(i+1);
}
return list;
}
}