3 1493同类题目 C++ 不定长滑动窗口

无重复字符的最长子串

用i表示左边界,dic字典中的元素为数字最后一次出现的索引 当遇到重复元素,更新左边界,更新最后一次出现的索引

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> dic;
        int i = -1, res = 0, len = s.size();
        for (int j = 0; j < len; ++j) {
            if (dic.count(s[j]))
                i = max(i, dic[s[j]]);
            dic[s[j]] = j;
            res = max(res, j - i);
        }
        return res;
    }
};

1493. 删掉一个元素以后全为 1 的最长子数组

删掉一个元素之后全为1的最长子数组,转化为只包含一个0的最长子数组,跟前一题一样,i表示左边界,用zidx表示0最后一次出现的索引,当重复碰到0时,更新zidx和左边界。得到最长长度之后,把包含的那个0去掉,就是答案。

class Solution {
public:
    int longestSubarray(vector<int>& nums) {
        int i = -1, res = 0, n = nums.size(), zidx = -1;

        for (int j = 0; j < n; ++j) {
            if (nums[j] == 0) {
                if (zidx >= 0) i = max(i, zidx);
                zidx = j;
            }
            res = max(res, j - i);
        }

        return res - 1;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值