开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个整数数组 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] <= 1090 <= 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;
}
};
提交排名
四、总结
这一题自己有了一定的思路,并进行尝试,是有进步的,加油!