本文主要是介绍219. 存在重复元素 II【 力扣(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] <= 109
0 <= k <= 105
三、解题思路
- 基本思路:
每遇到一个数,就去判断以前是否遇到过,遇到过在判断下标相差是否小于等于k
。 - 具体思路:
遍历序列,判断当前数是否存在 map 中,存在则判断下标是否<= k
,是则返回true
;否则,则把当前数和下标存放到map
中。
四、参考代码
时间复杂度: O ( n ) \Omicron(n) O(n)
空间复杂度: O ( n ) \Omicron(n) O(n) 【也可以优化到 O ( k ) \Omicron(k) O(k) ,只要改为 map 的大小超过 k 就开始删除元素】
class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {int n=nums.size();map<int,int> m;for(int i=0;i<n;i++){if(m.count(nums[i])==1&&i-m[nums[i]]<=k){return true;}m[nums[i]]=i;}return false;}
};
这篇关于219. 存在重复元素 II【 力扣(LeetCode) 】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!