zoukankan      html  css  js  c++  java
  • 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;
        }
    争取早日不再是一只菜鸡
  • 相关阅读:
    Ubuntu 14.04设置开机启动脚本的方法
    python 筛选
    分段压缩
    ubuntu 16.04 启用root用户方法
    Ubuntu 16.04 设置MySQL远程访问权限
    [分享]在ubuntu9.10下实现开机自动登录并运行自己的图形程序
    ubuntu live cd修复grub引导项
    安装dcm4chee-arc-light-5.4.1-mysql步骤
    数据库学习--wildfly配置postgreSQL数据源
    wildfly配置PostgreSQL数据源
  • 原文地址:https://www.cnblogs.com/jchen104/p/14661619.html
Copyright © 2011-2022 走看看