LeetCode(#448):找到所有数组中消失的数字

一、前言
本题为LeetCode第448题,是一道 数组 相关的算法题,难度简单。
本题链接:#448. 找到所有数组中消失的数字
二、题目
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
示例:
输入: [4,3,2,7,8,2,3,1]
输出: [5,6]
三、思路
首先分析题目要求。不使用额外空间,表示除了输入和输出变量外,不能定义其他临时变量;而时间复杂度为O(n),则表示不能使用嵌套循环。因此
- 需要对输入数组自身以某种方式进行修改,作为标记。
- 利用数组的索引。
解题思路为:遍历输入的数组,把数组中的每个元素记作索引,将所对应位置的元素改为负数(若已经为负数则不用修改)。最终数组中所有正数所在位置即为消失的数字。
示例:
[4, 3, 2, 7, 8, 2, 3, 1] 初始数据
[4, 3, 2, -7, 8, 2, 3, 1] 第一个元素为 4,将数组的第四个也就是下标 3 的元素修改为负数(遍历到 -7 时,取绝对值)
[4, 3, -2, -7, 8, 2, 3, 1]
[4, -3, -2, -7, 8, 2, 3, 1]
[4, -3, -2, -7, 8, 2, -3, 1]
[4, -3, -2, -7, 8, 2, -3, -1]
[4, -3, -2, -7, 8, 2, -3, -1]
[4, -3, -2, -7, 8, 2, -3, -1]
[-4, -3, -2, -7, 8, 2, -3, -1]
8 和 2 位于数组的第 5 和 6 位,因此消失的数字为 5 和 6 。
四、Java代码
1 class Solution { 2 public List<Integer> findDisappearedNumbers(int[] nums) { 3 List<Integer> list = new ArrayList<>(); 4 for(int i = 0; i < nums.length; i++) { 5 if(nums[Math.abs(nums[i]) - 1] > 0) { 6 nums[Math.abs(nums[i]) - 1] *= -1; 7 } 8 } 9 10 for(int i = 0; i < nums.length; i++) { 11 if(nums[i] > 0) { 12 list.add(i + 1); 13 } 14 } 15 return list; 16 } 17 }
五、补充
下方是LeetCode讨论区一位网名为端粒的人的评论,分析地很好,就搬上来了。


浙公网安备 33010602011771号