数组学习2
用滑动窗口双指针方法,从右指针开始求总target,如果大于等于target,则左指针递增,左指针值递减,慢慢缩小窗口值。注意一开始滑动窗口要设置的大。
class Solution {public int minSubArrayLen(int target, int[] nums) {int left = 0;int sum = 0;int ans = Integer.MAX_VALUE; // 修正语法错误for(int right = 0; right < nums.length; right++){sum += nums[right];// 使用while循环持续收缩窗口while(sum >= target) {ans = Math.min(ans, right - left + 1); // 在循环内部访问rightsum -= nums[left];left++; // 移动左指针}}return ans == Integer.MAX_VALUE ? 0 : ans;}
}
第二题
双指针从两端向中心扫描,右指针的大就放入数组,右指针左移,左指针相反。
class Solution {public int[] sortedSquares(int[] nums) {int n = nums.length;int[] ans = new int[n]; int i = 0; int j = n - 1; for (int p = n - 1; p >= 0; p--) {int x = nums[i] * nums[i]; int y = nums[j] * nums[j]; if (x > y) {ans[p] = x; i++; } else {ans[p] = y; j--; }}return ans;}
}
给个例子
以 nums = [-4, -2, 0, 3, 5]
为例:
步骤 | i | j | 比较 | 取用值 | 结果数组(后→前) ————————————————————————————————————————————————— 1 | -4↘ | 5↗ | 16<25 | 25 | [?, ?, ?, ?, 25] 2 | -4↘ | 3↗ | 16>9 | 16 | [?, ?, ?, 16, 25] 3 | -2↘ | 3↗ | 4<9 | 9 | [?, ?, 9, 16, 25] 4 | -2↘ | 0↗ | 4>0 | 4 | [?, 4, 9, 16, 25] 5 | 0 | 0 | 0=0 | 0 | [0, 4, 9, 16, 25]