给定一个字符串 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;}
}
给定一个含有 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;}
}
给你一个整数数组 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;}
}