LeetCode 219.存在重复元素II(c++)

90 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

219.存在重复元素II

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

示例 1:

输入: nums = [1,2,3,1], k = 3
输出: true

示例 2:

输入: nums = [1,0,1,1], k = 1
输出: true

示例 3:

输入: nums = [1,2,3,1,2,3], k = 2
输出: false

提示:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • 0 <= k <= 105

二、思路分析

一开始我就想用哈希表做,但用unordered_set还是unordered_map让我有些犹豫。但尝试过后,发现必须要记录nums中每个值所对应的索引。所以还是得用unordered_map。

这题比较坑,虽然没要求时间和空间复杂度,但在后面给了一个超长的nums,如果是用双循环来寻找并记录符合nums[i] == nums[j]的i和j,那么就会超出时间限制。

所以我们必须在一次循环内完成。所以最终的方法是,遍历nums,将nums[i]作为键值,i作为value,每次先检测哈希表中是否有重复的键值,有的话则看是否满足abs(i - t[nums[i]]) <= k,不满足的话则要将该键的值进行更新,也就是更新哈希表中该相同key的value。

这也是我新学到的一点,t.insert(1,2),在再一次遇到了t.insert(1,3)后,它的value仍为2。但如果采用t[nums[3]] = 3,那它的value就会变为3。

在本题中,我们希望i-t[nums[i]]越小越好,很显然i永远大于t[nums[i]],所以t[nums[i]]越大越好,因此我们需要更新value。

三、AC代码

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        unordered_map<int,int> t;
        for(int i=0;i<nums.size();i++){
            if(t.count(nums[i]) && i - t[nums[i]] <= k){   
                    return true;
                }
                t[nums[i]] = i;
        }
    return false;
    }
};

提交排名

image.png

image.png

四、总结

这一题自己有了一定的思路,并进行尝试,是有进步的,加油!