找到所有数组中消失的数字
题目描述
题目url:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1] 输出:[5,6] 。
解释:数组nums的长度是8,正常情况nums中的元素是1~8,而nums中缺少了5,6两个数。
示例 2:
输入:nums = [1,1] 输出:[2]
解释:nums数组只有两个2,正常范围是1~2,缺少2
题目分析
创建一个新数组newArr,其长度和就数组nums一样。从旧数组第一个元素开始取出元素值numVal=nums[i](i从0开始)。再把新数组newArr重点第numVal个的元素值赋值为1。一轮循环后新数组的第j个元素是0,就代表这个j是旧数组中缺少的。
1 | 旧数组 nums = [4,3,2,7,8,2,3,1] 新数组 newArr = [0,0,0,0,0,0,0,0] |
我的代码
1 | public static List<Integer> findDisappearedNumber1(int[] nums) { |
参考答案
思路是从0开始遍历数组nums,下标i的范围是[0,nums.length-1]。找出nums[i]在 在区间 【1,n】 内对应下标。比如nums[i]=4—>4对应的下标是3.让3号下标的元素变成负数。代表nums[i]出现过一次。for循环结束nums中哪个位置x元素>0,说明x+1是缺失的。
1 |
|
参考答案图解


对比总结
我的想法是用一个新的数组newArr【newArr的长度与旧数组相同】,在newArr中记录原数组的某个元素是否出现过,若出现让newArr对应下标的元素变成1.【比如 4在newArr中对应下标是3,就让newArr[3] =1 】。和参考代码相比我多创建了一个数组,多占用了一些栈内存。而参考答案只用了最原始的数组nums[],在nums[]中标记为负数。理想的数组ideaNums是不存在的【ideaNums的特点是从1到n的递增数列,每次+1】就可以用一个变量表示,节省了栈空间但是增加了逻辑复杂度。





