持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
一、题目描述:
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) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
二、思路分析:
一般的思路为新建一个数组记录当前出现过元素的位置,最后返回未出现的位置即可。 但是题目要求不用额外空间所以我们考虑对数组进行原地修改,但是修改会影响后续结果,所以我们需要保证,在i位置处修改了k位置的值后,我们在拿到K位置的值后必须能够还原回去。 根据题目中数组为正的条件,假设我们获得了a[i]处的值k,我们可以取k的绝对值,然后让a[k]处的值<0,对每个k只要出现过,a[k]就会是负的,最后只要遍历将a[i]>0的i输出即可
三、AC 代码:
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> res =new ArrayList<>();
for(int i=0;i<nums.length;i++){
int num = Math.abs(nums[i]);
nums[num-1] = nums[num-1]>0?nums[num-1]*-1:nums[num-1];
}
for(int i=0;i<nums.length;i++){
if(nums[i]>0){
res.add(i+1);
}
}
return res;
}
}
四、参考:
448找到所有数组中消失的数字(简单)#原地修改[PHP]「」【salmonl】 - 找到所有数组中消失的数字 - 力扣(LeetCode)