zoukankan      html  css  js  c++  java
  • 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;
            }
     
  • 相关阅读:
    【排序】紧急集合
    Tallest Cow(线段树较易)
    递归实现排列型枚举
    文件输入输出文件
    【分治】逃亡
    折半查找法(二分)
    递归/非递归实现组合型枚举(全排列问题)
    9.25DAY1T2
    9.25DAY1T1
    POI2004[MOS] 贪心+DP
  • 原文地址:https://www.cnblogs.com/dloading/p/10705649.html
Copyright © 2011-2022 走看看