题目链接:力扣
解题思路:双指针
①定义左右指针
②创建新数组,大小和旧数组一样
③循环:
若右指针指向的数的平方大于左边,则在新数组下标j处加入此数,新数组下标j--,右指针right--
若左指针指向的数的平方大于右边,则在新数组下标j处加入此数,新数组下标j--,左指针left++
代码如下:
class Solution {
public int[] sortedSquares(int[] nums) {
int l = 0;
int r = nums.length - 1;
int[] res = new int[nums.length];
int j = nums.length - 1;
while(l <= r) {
if(nums[l] * nums[l] <= nums[r] * nums[r]){
res[j--] = nums[r] * nums[r--];
} else {
res[j--] = nums[l] * nums[l++];
}
}
return res;
}
}
题目链接:力扣
解题思路:滑动窗口 双指针
①移动结束位置:窗口内的数小于目标值且未到最后一个数
②移动起始位置:窗口内的数大于等于目标值
代码如下:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int i = 0;
int res = Integer.MAX_VALUE;
for (int j = 0; j < nums.length; j++) {
sum += nums[j];
while(sum >= target){
int subL = j - i + 1;
res = Math.min(res, subL);
sum -= nums[i];
i++;
}
}
return res == Integer.MAX_VALUE ? 0 : res;
}
}
题目链接:力扣
解题思路:
①分区间:左到右,上到下,有到左,下到上,都是左闭右开,避免重复
②确定循环次数:n/2,若n为奇数,需单独给中心元素赋值
class Solution{
public int[][] generateMatrix2(int n) {
int loop = 0;
int start = 0;
int count = 1;
int[][] res = new int[n][n];
int i,j;
while(loop++ < n / 2) {
for(j = start; j < n - loop; j++){
res[start][j] = count++;
}
for(i = start; i < n - loop; i++) {
res[i][j] = count++;
}
for(;j >= loop; j--){
res[i][j] = count++;
}
for(; i >= loop; i--){
res[i][j] = count++;
}
start++;
}
if(n % 2 == 1){
res[start][start] = count;
}
return res;
}
}
学习了滑动窗口的思想并加深了双指针的练习。做螺旋矩阵时把自己绕进去了,没有理清楚loop和start的作用,还需要多加思考。
世间皆苦,唯有自渡。