算法题
977.有序数组的平方
class Solution {
public int[] sortedSquares(int[] nums) {
//双指针法——左右指针
int k=nums.length-1;
//注意数组初始化
int[] result=new int[nums.length];
for(int i=0,j=nums.length-1;i<=j;){
if(nums[i]*nums[i]>nums[j]*nums[j]){
result[k]=nums[i]*nums[i];
k--;
i++;
}
else{
result[k]=nums[j]*nums[j];
k--;
j--;
}
}
return result;
}
}
注意:
- 数组初始化
- for循环的循环终止条件 i<=j
- nums[i] = nums[j] 的情况
- 使用方法:双指针—左右指针,因为分析题目特性可知最大值在数组两边,最小值在数组中间
209.长度最小的子数组
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int lens=Integer.MAX_VALUE;//最大值
int i=0;//起始
int sum=0;
for(int j=0;j<nums.length;j++){
sum+=nums[j];
while(sum>=target){
lens=Math.min(lens,j-i+1);
sum-=nums[i];
i++;
}
}
if(lens==Integer.MAX_VALUE){
return 0;
}
return lens;
}
}
滑动窗口
适用条件:求某个子串或者子序列最长最短等最值问题或者求某个目标值时
注意:
- 重点:滑动窗口的起始位置
- 核心:双指针
- i 是滑动窗口的起始位置,j 是滑动窗口里面的终止位置
- 为了避免与暴力解法相同,for循环里面的 j 一定指向的是终止位置,而且只需要一个for循环,起始位置i 用动态移动的方式来改变起始位置。
- 终止位置 j 随着for循环向后移动,当sum>=target时,说明已经找到满足条件的长度,收集该长度,开始移动起始位置。
59.螺旋矩阵II
class Solution {
public int[][] generateMatrix(int n) {
//每次循环的起始下标
int x=0;
int y=0;
//用于填充的数字
int count=1;
//数组
int [][] result=new int[n][n];
//循环的次数
int loop=n/2;
// 需要控制每一条边遍历的长度,每次循环右边界收缩一位
int offset=1;
//循环过程中用于操作x,y轴的变量
int i=0;
int j=0;
while(loop>0){
loop--;
//不能是j=0,如果j=0的话那在结束第一层后无法进入第二层
//因为j还是从0开始,意味着还是从第一列开始循环,而第二层要从第二列开始
//j<n-offset 没有等于是因为用的是“左闭右开”的方式
for(j=y;j<n-offset;j++){
result[x][j]=count;
count++;
}
for(i=x;i<n-offset;i++){
result[i][j]=count;
count++;
}
for(;j>y;j--){
result[i][j]=count;
count++;
}
for(;i>x;i--){
result[i][y]=count;
count++;
}
x++;
y++;
offset++;
}
//result[n/2][n/2]这个位置是矩阵中心位置
if(n%2==1){
result[n/2][n/2]=count;
}
return result;
}
}
注意:
这里的边界用“左闭右开”的方式选择