zoukankan      html  css  js  c++  java
  • Leecode-每日一题-题目448. 找到所有数组中消失的数字

    今天重新开始刷leecode 为了致敬我的偶像,还是选择把做题笔记发在博客园上

    题目448. 找到所有数组中消失的数字

    给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
    找到所有在 [1, n] 范围之间没有出现在数组中的数字。
    您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
    示例:
    输入:
    [4,3,2,7,8,2,3,1]
    输出:
    [5,6]
    链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array

    解题经历

    首选当然是哈希表,想要再开一个数组,然后再用下标索引进行记录,但是上面的加粗字体为我带上了痛苦面具!!思前想后,还是点开了题解5555

    题解复述

    思路:** 原地修改 ** :这个思路的核心我认为在两点:

    • 1.不产生额外的空间:直接对数组进行修改,数组本身就是一个哈希记录表
    • 2.那怎么在同一个cell里面又做记录又有原来的信息嘞—— 利用取余还原的思想 也就是对应的所以增加n,当再次对n取余的时候就会还原啦
    • 3.需要注意索引的修改(以前都喜欢暴力的绝对11 对应)这波只能是 用 x-1(数组是从0开始的
      贴一波代码啦
    class Solution {
        public List<Integer> findDisappearedNumbers(int[] nums) {
         for(int i=0;i<nums.length;i++){
             int x=(nums[i]-1)%nums.length;  //1.为了控制数组0开始    2.为了防止这个index已经被别的相加过了
             nums[x]+=nums.length;
         }
        List<Integer> rest=new ArrayList<Integer>();
        for(int i=0;i<nums.length;i++){
            if(nums[i]<=nums.length){
                rest.add(i+1);
            }
        }
        return rest;
    }
    }
    

    此外,对于我而言这也是使用ArrayList的一个语法记忆点了
    List rest=new ArrayList()
    暴力贴Java-ArrayList连接

  • 相关阅读:
    woj 1574
    UESTC 594 我要长高 dp单调队列
    HDU 3401 Trade dp 单调队列优化
    HDU 2844 Coins 多重背包
    2-1
    1-2
    1-1
    12-1
    9-1
    14-8
  • 原文地址:https://www.cnblogs.com/wengst/p/14400866.html
Copyright © 2011-2022 走看看