Leetcode 219. 存在重复元素 II

说明:

  首先,这是一道Easy题,我天!但是题意理解还是很多坑~

题目描述:

  给定一个整数数组和一个整数 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

理解:

  寻找每个元素最先出现的位置和最终出现的位置,如果i和j不同,取其绝对值,看是否可以达到k,如果等于k,说明满足题意!

1 struct node {
2     int max = -1;
3     int min = -1;
4 };
 1 bool containsNearbyDuplicate_bak(vector<int>& nums, int k) {
 2     //两个map,一个存最小下标,一个存最大下标
 3     map<int, int> mp;  //用于统计出现的字符个数
 4     map<int, node> maxDisMap;  //用于存放距离
 5     int i,res=0;
 6     for (i = 0; i<nums.size(); i++)
 7     {
 8         mp[nums[i]]++;
 9         if (mp[nums[i]] == 1)
10         {
11             //首次出现,存入距离
12             maxDisMap[nums[i]].min = i;
13         }
14         else if (mp[nums[i]] > 1) {
15             maxDisMap[nums[i]].max = i;
16         }
17     }
18     //遍历数组中的最大最小值的差值
19     map<int, node>::iterator it;
20     for (it = maxDisMap.begin(); it != maxDisMap.end(); it++)
21     {
22         if (it->second.max - it->second.min > res)
23             res = it->second.max - it->second.min;
24     }
25     if (res == k)
26         return true;
27     return false;
28 }

 

  那么问题来了,对于示例2而言,第一个1出现的位置索引是0,最后一个出现的位置索引是3,其差的最大绝对值为3,大于给定的k,为什么返回true???

  发现讨论区里也有很多类似的问题在讨论

  

  这样看来,只要保证存在小于等于k的两个绝对值的差,即可,修改代码如下:

 1 bool containsNearbyDuplicate(vector<int>& nums, int k) {
 2     //两个map,一个存最小下标,一个存最大下标
 3     map<int, int> mp;  //用于统计出现的字符个数
 4     map<int, node> maxDisMap;  //用于存放距离
 5     int i, res = INT_MAX;
 6     for (i = 0; i<nums.size(); i++)
 7     {
 8         mp[nums[i]]++;
 9         if (mp[nums[i]] == 1)
10         {
11             //首次出现,最大最小都存起来
12             maxDisMap[nums[i]].min = i;
13             maxDisMap[nums[i]].max = i;
14         }
15         else if (mp[nums[i]] == 2) {
16             maxDisMap[nums[i]].max = i;  //更新最大值
17             if (maxDisMap[nums[i]].max - maxDisMap[nums[i]].min <= k)
18                 return true;
19         }
20         else {
21             maxDisMap[nums[i]].min = maxDisMap[nums[i]].max;  //往后推,只记录相邻的两个相同值
22             maxDisMap[nums[i]].max = i;
23             if (maxDisMap[nums[i]].max - maxDisMap[nums[i]].min <= k)
24                 return true;
25         }
26     }
27     return false;
28 }

  等待学习新的方法~~~

 

posted @ 2019-12-11 12:32  _小学生  阅读(307)  评论(0编辑  收藏  举报