一、数组---存在重复元素2
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例 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 //自己的想法,时间复杂度有点高,超时了 2 bool containsNearbyDuplicate(vector<int>& nums, int k){ 3 bool find=false; 4 if(nums.size()==0) return false; 5 for(int i=0;i<nums.size() && not find;i++){ 6 for(int j=nums.sieze();j>i && not find;j--){ 7 if(nums[i]==nums[j] && j-i<=k ) return find=true;//设置一个标记find,这样就可以跳出多重循环 8 } 9 } 10 return find; 11 }
1 //使用map构建哈希表,键值对 :数组元素-索引 2 bool containsNearbyDuplicate(vector<int>& nums,int k){ 3 if(nums.size()==0) return false; 4 map<int,int> mymap; 5 for(int i=0;i<nums.size();i++){ 6 //如果map中的valve存在这个键,判断索引和这个值的差值是否为小于等于k 7 //如果大于,那就更新索引值,这样就继续向后遍历了,因为要找的是小于等于k,大于寿命相差的太远了,所以要索引移动到更近一点 8 if(a.count(nums[i])){ 9 //i是新的i,nums[i]里面的i是之前存在里面的,是旧的i 10 if(i - a[nums[i]] <= k) return true; 11 else a[nums[i]] = i; 12 } 13 else mymap.insert(map<int,int>::value_type(nums[i],i)) 14 } 15 return false; 16 }