[同向双指针] 209. 长度最小的子数组 713. 乘积小于 K 的子数组 3. 无重复字符的最长子串

同向双指针

该文结合灵神讲解进行编码:https://www.bilibili.com/video/BV1hd4y1r7Gq

该类滑动窗口一般符合某种单调性。

当不满足条件时左指针后移,当满足条件时右指针后移。

假设数组长度为 n,左指针最多移动 n 次,右指针最多移动 n 次,因此时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)

209. 长度最小的子数组

https://leetcode.cn/problems/minimum-size-subarray-sum/

在这里插入图片描述

Solution

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int l = 0, r = 0;
        int sum = 0;
        int ans = nums.length + 1;
        while (r < nums.length) {
            sum += nums[r];
            while (sum >= target) {
                ans = Math.min(r - l + 1, ans);
                sum -= nums[l++];
            }
            r++;
        }
        return ans <= nums.length ? ans : 0;
    }
}

713. 乘积小于 K 的子数组

https://leetcode.cn/problems/subarray-product-less-than-k/

在这里插入图片描述

Solution

class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        if (k <= 1) {
            return 0;
        }
        int l = 0, r = 0;
        int prod = 1;
        int ans = 0;

        while (r < nums.length) {
            prod *= nums[r];
            while (prod >= k) {
                prod /= nums[l++];
            }
           ans += r - l + 1; // key point
           r++;
        }

        return ans;
    }
}

3. 无重复字符的最长子串

https://leetcode.cn/problems/longest-substring-without-repeating-characters/

在这里插入图片描述

Solution(哈希表+双指针)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length()<=1){
            return s.length();
        }
        char[] chars = s.toCharArray();
        int[] hash = new int[128];
        int l = 0, r = 0;
        int ans = 0;

        while (r < s.length()) {
            hash[chars[r]]++;
            while (hash[chars[r]] > 1) {
                hash[chars[l++]]--;
            }
            ans = Math.max(ans, r - l + 1);
            r++;
        }

        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇咔咔负负得正

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值