448. 找到所有数组中消失的数字
作者:互联网
这题和之前的268. 丢失的数字 、136. 只出现一次的数字 、387. 字符串中的第一个唯一字符 有类似又有不同的地方
由于本题中的数组元素存在相同元素,有的出现2次,有的出现1次,所以不能使用异或来直接得出结果。
于是我们想到使用哈希表来构建映射关系,参考387题。
但是题目提出了进一步的要求,不使用额外的空间。这里我们利用数组本身来代替哈希表实现对应
的映射关系。key,value对应关系为数组下标,数组的值。由题意我们可以得出以下结论,
数组值得范围[1,n],数组下标[0,n-1],这就让我们有机会把nums[x]与x+1构建对应关系。
我们将nums[i]对n取余可得到num[i]所对应映射得key即index,再将nums[index]+n,这样做得好处
在于一方面使得nums[index]必然大于n,标记index重复,同时不影响nums[index]原值在数组中得映射,因为(nums[index]+n)%n=nums[index]%n
时间O(n),空间O(1)
public List<Integer> findDisappearedNumbers(int[] nums) { int len = nums.length,index=0; for (int num:nums){ // 计算num所对应的数组下标,注意数组从0开始,此处需要-1 index = (num-1)%len; // 使得nums[x]大于n来标记相应下标是否出现在数组中 nums[index]= nums[index]+len; } List<Integer> list = new ArrayList<Integer>(); for (int i=0;i<len;i++){ // 边界值n需要注意 if (nums[i]<=len){ // 数据下标需要+1操作才能代表正确的数字 list.add(i+1); } } return list; }
标签:index,448,下标,数字,nums,int,num,数组 来源: https://www.cnblogs.com/jchen104/p/14661619.html