977.有序数组的平方
解法1:计算每个数字的平方,然后进行排序,时间复杂度为O(n^2)
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
// O(n^2)
for(int i=0; i<nums.length; i++){
nums[i] = nums[i] * nums[i];
}
Arrays.sort(nums);
return nums;
}
}
解法2:
观察特点-双指针法: 正数和负数是有序的,所以对于两个有序序列进行归并排序即可,从两端进行绝对值比较,绝对值大的肯定平方后最大,放在最后的位置上即可
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
// 时间复杂度为O(n)
int[] ans = new int[nums.length];
int idx = nums.length-1;
int l = 0, r = nums.length-1;
while(l <= r){
if(Math.abs(nums[l]) > Math.abs(nums[r])){
ans[idx--] = nums[l] * nums[l];
l++;
}else{
ans[idx--] = nums[r] * nums[r];
r--;
}
}
return ans;
}
}
209.长度最小的子数组
解题思路: 题目都是正整数,所以越加只会越大,不会变小 利用滑动窗口,当窗口内的和大于target时,删除窗口头部的值,当小于target时,增大窗口的值,整个过程记录窗口内>=target的窗口最小长度
代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
// 滑动窗口
int l = 0, r = 0, sum = 0;
int ans = 0x7fffffff;
while(r < nums.length){
sum += nums[r++];
while(sum >= target){
ans = Math.min(ans, r - l);
sum -= nums[l++];
}
}
return ans==0x7fffffff ? 0:ans;
}
}