题解 | 最长无重复子数组

#include <queue>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) {
        //哈希表记录窗口内非重复的数字
        unordered_map<int, int> mp;
        int res = 0;
        //设置窗口左右边界
        for (int left = 0, right = 0; right < arr.size(); right++) {
            //窗口右移进入哈希表统计出现次数
            mp[arr[right]]++;
            //出现次数大于1,则窗口内有重复
            while (mp[arr[right]] > 1)
                //窗口左移,同时减去该数字的出现次数
                mp[arr[left++]]--;
            //维护子数组长度最大值
            res = max(res, right - left + 1);
        }
        return res;
    }
};

学习了官方的滑动窗口思路,滑动条件是这样的,我们应该扩展右边,如果出现重复,我们只知道在左边,但是不知道左边的位置在哪,这时候,这里采用的思路就是一直往右搜,直到找到这个位置,但是,我们不保证当前的就是最优的,所以res=max(res,right-left+1)。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务