• 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;
        }
    争取早日不再是一只菜鸡
  • 相关阅读:
    将SVD应用于推荐系统
    matrix.A
    机架感知配置
    PCA主成分分析进行数据降维
    Rabbitmq的高级特性
    Topics(主题模式)
    Routing(exchange--direct)
    fanout(Publish/Subscribe)发布/订阅
    Work Queues(工作队列)
    simple queue(简单队列)
  • 原文地址:https://www.cnblogs.com/jchen104/p/14661619.html
Copyright © 2020-2023  润新知