leetcode977题.有序数组的平方
题目链接: 977. 有序数组的平方 - 力扣(LeetCode)
解题思路:
利用双指针法,比较左右指针对应的数的平方和,把值比较大的放在数组右边.
易错点:
while循环这里,需要 left 和right相等吗? 需要,假设不想等的话,循环到最后只剩下两个元素的时候,把最大值的平方一记录,另外一个就落下了.
遗留疑问:
这个题目,给的参考答案里面,重新new了一个数组,直接利用原有数组,不重新new数组, 可以整出来嘛???
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int[] arr = new int[nums.length];
int index=nums.length - 1;
while (left <= right) {
if (nums[left] * nums[left] < nums[right] * nums[right]) {
arr[index--] = nums[right] * nums[right];
right--;
} else {
arr[ index--]=nums[left] * nums[left];
left++;
}
}
return arr;
}
}
leetcode 209.长度最小的子数组
解题思路:
利用滑动窗口,计算窗口下的值是否>=target.,满足>=target时,记录窗口的最小值.
一旦满足sum>= target的时候,执行减去窗口左边的值,窗口左边右移,重新记录(更新)满足条件的窗口内的连续数组的最小长度. 只要满足sum>= target,while循环可以一直执行.
窗口
本题目没有想到的地方是:
1. 要使用while循环.自己使用的是if循环.
假如滑动窗口尾部的 靠右边的值比较大,头部 靠左边的值比较小, 满足sum >= target时,循环内部的内容就要执行多次.
比如这组测试用例: target = 7, nums = [2,3,1,2,4,3]
执行到1,2,4,3的时候,窗口的右边已经到数组的右边界,可以重复的while循环,才能得到4,3这个最短的连续数组.
2. 结尾处返回二元表达式,我直接返回的是min.
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
// 记录滑动窗口对应数组长度的最小值
int min = Integer.MAX_VALUE;
int left = 0;
for (int right = 0; right < nums.length ;right++) {
sum += nums[right];
while (sum >= target) {
min=Math.min(min,right-left+1 ) ;
sum-=nums[left];
left+=1;
}
}
return min==Integer.MAX_VALUE ? 0: min;
}
}
leetcode 59.螺旋矩阵
题目链接: 力扣
解题思路:
我实在想不出来需要定义这么多变量.这个题目实际也考察二维数组
int[][] arr = new int[n][n] 的打印效果.可以尝试打印如图的数组辅助理解,什么时候该操作第一个 n,什么时候操作第二个n.
class Solution {
public int[][] generateMatrix(int n) {
int[][] arr = new int[n][n];
// 定义填充数字
int count = 1;
int i = 0, j =0;
// 定义循环圈数
int loop = 0;
// 每圈开始的位置
int start = 0;
while (loop++ < n / 2) { // loop=1
for (j = start; j< n - loop; j++) {
arr[start][j] = count++;
}
for (i = start; i < n - loop; i++) {
arr[i][j] = count++;
}
for (; j >= loop; j--) {
arr[i][j] = count++;
}
for (; i >= loop; i--) {
arr[i][j] = count++;
}
start++;
}
if (n % 2 == 1) {
arr[start][start] = count++;
}
return arr;
}
}