448-查找数组中消失的所有数字

给定整数的数组,其中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;
        }
 
原文地址:https://www.cnblogs.com/dloading/p/10705649.html