977.有序数组的平方
原题链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
解题思路:
双指针法:由于有序数组的特性,两边数值的平方大于中间数值的平方,所以采取双指针法先取两边的较大值
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int k = nums.length-1;
int[] result = new int[nums.length];
// 双指针法 从两边开始比较
for(int i=0,j=k;i<=j;){ // i表示数组第一个元素的下标 j表示数组最后一个元素的下标
// 把较大的值放入新数组的最后一位
if(nums[i]*nums[i] > nums[j]*nums[j]){
result[k--] = nums[i]*nums[i];
i++;
}else{
result[k--] = nums[j]*nums[j];
j--;
}
}
return result;
}
}
209.长度最小的子数组
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
思路:
定义两个指针:起始指针和结束指针;起始指针不动,遍历结束指针直到sum>=target;满足条件后减去起始指针的值并向前移动一位起始指针的位置;循环。
注意点:
如何移动起始位置? 当已经计算出满足条件的结果后。
代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i = 0; // i表示起始位置
int sum = 0; // 记录相加的结果
int subL = 0; // 滑动窗口的长度
int result = Integer.MAX_VALUE; // 将结果初始为一个最大值
for(int j=0;j<nums.length;j++){ // j表示终止位置
sum+=nums[j];
while(sum >= target){
subL = j-i+1;
result = Math.min(result,subL); // 取最小长度
sum -= nums[i];
i++; // 缩小窗口
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
59.螺旋矩阵II
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
注意点:
要用统一规则处理每一条边界:左闭右开
转几圈的问题:奇数/偶数
代码:
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0; // 控制循环次数
int[][] result = new int[n][n];
int startx = 0,starty = 0; // 每次循环的开始点
int count = 1; // 定义填充数字
int i,j;
while(loop++ < n / 2){ // 循环次数
// 模拟上侧从左到右(但不填充最右边的数:左闭右开,下面的循环同理)
for(j = starty;j < n - loop;j++){
result[startx][j] = count++;
}
// 模拟右侧从上到下
for(i = startx;i < n - loop;i++){
result[i][j] = count++;
}
// 模拟下侧从右到左
for(;j>starty;j--){
result[i][j] = count++;
}
// 模拟左侧从下到上
for(;i>startx;i--){
result[i][j] = count++;
}
startx++;
starty++;
}
// 如果是单数行,则填充中心数
if(n%2 == 1){
result[startx][starty] = count;
}
return result;
}
}
文章介绍了如何使用双指针法解决有序数组的平方问题以及滑动窗口技巧解决寻找最小子数组长度问题。同时,文章还讨论了生成螺旋矩阵的算法,特别处理了边界和奇偶数圈的情况。
1179

被折叠的 条评论
为什么被折叠?



