算法日常・每日刷题--<哈希>4

219. 存在重复元素 II - 力扣(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 <= 105https://leetcode.cn/problems/contains-duplicate-ii/description/

一、题目

给定整数数组 nums 和整数 k,判断是否存在两个不同下标 i、j,满足:

  1. nums[i] == nums[j]
  2. abs(i - j) ≤ k 满足条件返回 true,否则返回 false

二.解法

心思想

使用 unordered_map哈希映射,建立映射关系:数组数值 → 该数值上一次出现的下标。 遍历流程:

  1. 遍历到下标i,取出当前数字nums[i]
  2. 查询哈希表:
    • 如果该数字曾经存在,计算当前下标与上次下标差值;差值 ≤ k,直接返回true
    • 如果不满足条件 / 数字从未出现,更新哈希表中该数字的下标为当前 i

关键:只保存最近一次出现的下标。如果旧下标距离超出 k,旧记录没有保留价值,直接覆盖。

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

        }
        return false;
   
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值