今天继续刷LeetCode,第219题,判断一个数组中是否有相等的元素,并且两者下标相差k。
分析:
1、这个题目可以通过简单粗暴的方式,每遍历到一个元素,就比较其后面k个数是否和这个数相等,否则就继续遍历,这个方法虽然可行,但是时间复杂度是O(nk),超时。
2、那么可以通过设置一个map映射,每遍历一个元素,就判断map中是否有该元素,并且下标之差为k,这个查找只需要O(1)的查找时间,因此整个时间复杂度为O(n),当然需要额外的空间开销。
问题:
1、map的使用;
2、python中map的使用是字典
附上C++代码:
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int,int> m;
for(int i=0;i<nums.size();i++)
{
if(m.find(nums[i])!=m.end()&&(i-m[nums[i]]<=k))
return true;
m[nums[i]]=i;
}
return false;
}
};
附上Python代码:
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
m={}
for i in range(len(nums)):
if nums[i] in m and i-m[nums[i]]<=k:
return True
else:
m[nums[i]]=i
return False