题解 | 最长无重复子数组
#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)。