3.无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
经典题目,不再赘述,思路直接看代码
class Solution {
public int lengthOfLongestSubstring(String s) {
int max = 0, left = 0, right = 0;
boolean[] map = new boolean[128];
while (right < s.length()) {
while (right < s.length() && !map[s.charAt(right)]) {
map[s.charAt(right)] = true;
right++;
}
max = Math.max(max, right - left);
map[s.charAt(left)] = false;
left++;
}
return max;
}
}
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0 。
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
输入:target = 4, nums = [1,4,4]
输出:1
参考第3题,写出了如下代码。
也是双指针,只是第3题要求的是最长,右指针走到终点即可退出;而此题要求的是最短,右指针走到终点后还需要看一下左指针。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int res = 999999, left = 0, right = 0, sum = 0;
while (right < nums.length) {
while (right < nums.length && sum < target) {
sum += nums[right];
right++;
}
if (sum >= target) {
res = Math.min(res, right - left);
sum -= nums[left];
left++;
}
}
while (left < nums.length && sum >= target) {
res = Math.min(res, right - left);
sum -= nums[left];
left++;
}
return res == 999999 ? 0 : res;
}
}
题解看到的更简洁版本,总体思路是一样的,可以看看细微差别,为什么别人这么写更好更简洁:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int res = 999999, left = 0, right = 0, sum = 0;
while (right < nums.length) {
sum += nums[right];
while (sum >= target) {
res = Math.min(res, right - left + 1);
sum -= nums[left];
left++;
}
right++;
}
return res == 999999 ? 0 : res;
}
}
713. 乘积小于 K 的子数组
给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
老思路,思路明晰,看代码即可:
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
int left = 0, right = 0, res = 0, multi = 1;
while (right < nums.length) {
multi *= nums[right];
while (left <= right && multi >= k) {
multi /= nums[left];
left++;
}
res += (right - left + 1);
right++;
}
return res;
}
}