原贴地址:https://dawnmagnet.github.io/algorithm-station/docs/2022/1/18
给你一个整数数组 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 <= 10^5
- -10^9 <= nums[i] <= 10^9
- 0 <= k <= 10^5
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/contains-duplicate-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析 #
本题用一个通俗易懂的话讲解一下,就是在一个数组中找出下标相距小于一个特定值的两个相同值。而如何更高效地判断呢?
我们可以使用滑动窗口高效的解决这一个题目,因为按照题目要求,可能配对的两个值一定是在总长度为k+1的下标区间中,所以我们可以维护一个长度为k+1的滑动窗口,另外使用一个哈希表来判断是否有重复的值,从而只在这个区间内判断是否存在合法的答案
Rust 代码 #
impl Solution {
pub fn contains_nearby_duplicate(mut nums: Vec<i32>, k: i32) -> bool {
let k = k as usize;
let mut map = std::collections::HashMap::new();
for i in 0..nums.len() {
if i > k {
*map.entry(nums[i - k - 1]).or_insert(0) -= 1;
}
*map.entry(nums[i]).or_insert(0) += 1;
if *map.entry(nums[i]).or_insert(0) > 1 {
return true;
}
}
return false;
}
}