LeetCode442- 数组中重复的数据,448-找到所有数组中消失的数字 | 算法练习系列

95 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

前言

继续来两道简单的数组统计的题目,数组类型的题目还是挺多的,题型也比较多。

442题目描述

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

示例 1:

输入:nums = [4,3,2,7,8,2,3,1] 输出:[2,3] 示例 2:

输入:nums = [1,1,2] 输出:[1] 示例 3:

输入:nums = [1] 输出:[]

解题思路

这一题属于简单题目,其中需要注意的点如下:

  • 首先要明确整数数组中项都在[1,n]中,那么我们就可以循环这个1-n的数组
  • 在循环过程中用map来做记录,其中map的键为当前项的值,如果map中不存在这个键那就存入,也就是map.set(nums[i],1)
  • 如果map中已经存在了当前项的键,那么说明当前项就是重复的,push进结果数组即可

代码如下:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findDuplicates = function(nums) {
    var map = new Map()
    let result = []
    for(let i=0;i<nums.length;i++){
        if(map.get(nums[i])){
            result.push(nums[i])
        }else{
            map.set(nums[i],1)
        }
    }
    return result
};

运行结果如下图:

image.png

448题目描述

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

  示例 1:

输入:nums = [4,3,2,7,8,2,3,1] 输出:[5,6] 示例 2:

输入:nums = [1,1] 输出:[2]

解题思路

这题和上题的区别是上题是统计重复的数字,这题是统计确实的数字,注意的点有以下几点

  • 这里题目中的n就是数组的长度
  • 我们可以直接以[1-n]这个数组来循环,同时判断nums[i]中是否存在当前项(通过indexOf) 代码如下:
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findDisappearedNumbers = function(nums) {
    let count = nums.length
    let result = []
    for(let i=1;i<=count;i++){
        if(nums.indexOf(i)===-1){
            result.push(i)
        }
    }
    return result
};

这道题目中用了indexOf,也可以不用,直接用当前数组当做一个哈希表也可以实现题目的要求

总结

对数组的处理在日常的工作中是很常见的,一定掌握对数组的各种操作,继续加油,gogogo