977.有序数组的平方 题目链接
本题使用双指针。创建一个新数组存放结果,分别从nums数组的首和尾开始遍历左右指针指向的元素哪个平方更大,就将其平方放入新数组中,之后指向平方更大的元素的指针移动,左指针右移,右指针左移
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int[] res = new int[nums.length];
int resIndex = nums.length - 1;
while(left <= right){
if(nums[left] * nums[left] >= nums[right] * nums[right]){
res[resIndex--] = nums[left] * nums[left];
left++;
}else{
res[resIndex--] = nums[right] * nums[right];
right--;
}
}
return res;
}
}
———————————————————————————————————————————
209.长度最小的子数组 题目链接
本题使用滑动窗口,left、right分别指向窗口的首尾,right负责在窗口中的和小于target时向右寻找使得和大于等于target的元素,left负责在right找到使得和大于等于target的元素时,不断向右收缩窗口大小,寻找符合条件的最小窗口
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int res = nums.length + 1;
int sum = 0;
for(int right = 0; right < nums.length; right++){
sum += nums[right];
while(left <= right && sum >= target){
res = Math.min(res, right - left + 1);
sum -= nums[left++];
}
}
return res == nums.length + 1 ? 0 : res;
}
}
——————————————————————————————————————————
59.螺旋矩阵II 题目链接
模拟画图的过程,拐角处的值让新的方向来画 (左闭右开)
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int floor = 0;
int left = 0;
int ceil = n - 1;
int right = n - 1;
int num = 0;
int direct = 0; //方向,0:向右,1:向下,2:向左,3向上
int x = 0;
int y = 0;
while(++num <= n * n){
switch (direct){
case 0:
res[x][y++] = num;
if(y >= right){
direct = 1;
floor++;
}
break;
case 1:
res[x++][y] = num;
if(x >= ceil){
direct = 2;
right--;
}
break;
case 2:
res[x][y--] = num;
if(y <= left){
direct = 3;
ceil--;
}
break;
case 3:
res[x--][y] = num;
if(x <= floor) {
direct = 0;
left++;
}
}
}
return res;
}
}