题解 | #最长无重复子数组#

1.  判断某个键是否存在时一定要用map.count(key),而不要用map[key]避免该值本身是0的情况
2. 不能不消除上一个子序列在map中的键值,否则就会在后续某个值和前面某序列有重复值时left指针跳到前面
3. 注意尾部处理,假如最后一个值不与窗口内的重复的话就会跳过count的计算
class Solution {
public:
    /**
     * 
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& s) {
        if(s.size() == 1) return 1;
        unordered_map <int, int> map;    //键:记录数字, 值:记录该数字所在的位置
        int maxcount = 0;
        int left = 0, right = 0;
        while(right < s.size()){
            if(!map.count(s[right])){
                map[s[right]] = right;
                right++;
            }else{
                int count = right - left;
                if(count > maxcount) maxcount = count;
                left = map[s[right]]+1;
                map.clear();
                right = left;
            }
        }
        int count = right - left;
        if(count > maxcount) maxcount = count;
        return maxcount;
    }
};
但是这种方法存在重复遍历的情况,效率比较低
为了解决指针不跳转至中间的情况,我们再对哈希表中重复出现的情况做一个判断:是否在窗口内
采用滑动窗口的解法:
if(s.size() == 1) return 1;
        unordered_map <int, int> map;    //键:记录数字, 值:记录该数字所在的位置
        int maxcount = 0;
        int left = 0, right = 0;
        while(right < s.size()){
            if(!map.count(s[right])||map[s[right]] < left){
                map[s[right]] = right;
            }else {
                int count = right - left;
                if(count > maxcount) maxcount = count;
                left = map[s[right]]+1;
                map[s[right]] = right;
            }
            right ++;
        }
        int count = right - left;
        if(count > maxcount) maxcount = count;
        return maxcount;



全部评论

相关推荐

accaacc:2到4k,不是2k到4k,所以年薪是30块
点赞 评论 收藏
分享
牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务