zoukankan      html  css  js  c++  java
  • 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 }

      等待学习新的方法~~~

  • 相关阅读:
    【题解】魔术棋子
    NHOI2019小结
    【题解】滑雪
    【题解】最大平台
    【题解】洪水
    【题解】N皇后问题
    【题解】四色定理
    使用Docker快速搭建Jenkins
    使用Docker快速搭建Gitlab
    测试用Docker Swarm环境搭建
  • 原文地址:https://www.cnblogs.com/cnyulei/p/12021799.html
Copyright © 2011-2022 走看看