给定整数的数组,其中1≤A [1]≤ Ñ(Ñ =数组的大小),一些元件出现两次以及其他出现一次。 查找未出现在此数组中的[1,n ]包含的所有元素。 你可以在没有额外空间和O(n)运行时的情况下完成吗?您可能认为返回的列表不计入额外空间。
例:
输入: [4,3,2,7,8,2,3,1]
输出: [5,6]
解法1:创建一个A数组作为桶数组,将nums数据元素值作为通数组的索引。 由于该解法新建一个额外数组空间。所以最好不要采用此种解法 public static List<Integer> findDisappearedNumbers(int[] nums) { List<Integer> list=new ArrayList<>(); int n=nums.length; int j=1; int A[]=new int[n+1]; for (int k=0;k<n;k++) { A[nums[k]]++; } while (j<=n) { if (A[j]==0) { list.add(j); } j++; } return list; } 解法2:将nums数组本身当做桶数组,将数组元素值得绝对值-1后座位作为桶数组的索引,索引对应的数组元素值>0,则将此数据元素的索引下的数组值置为原来的相反数。此时出现原数组中存在的元素值对应索引数组元素小于0,原数组中消失的元素值对应的索引元素值>0。![]()

public static List<Integer> findDisappearedNumbers(int[] nums) { List<Integer> list = new ArrayList<>(); for (int i=0;i<nums.length;i++) { int index=Math.abs(nums[i])-1; if (nums[index]>0) { nums[index]=-nums[index]; } } for (int j=0;j<nums.length;j++) { if (nums[j]>0) { list.add(j+1); } } return list; }