一、数组---存在重复元素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 }

 

posted @ 2019-06-10 20:57  Austin_anheqiao  阅读(219)  评论(0编辑  收藏  举报