题目链接:977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
解题思路:看到这道题目的第一想法是有两种做法:一是将数组中的每个元素平方,得到新的心得数组,然后再重新排序,另一种是先将数组中的元素按绝对值排完序,再进行平方操作。
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length -1;
int[] result = new int[nums.length];
int n = nums.length - 1;
while(left <= right) {
if(nums[left] * nums[left] > nums[right] * nums[right]) {
result[n--] = nums[left] * nums[left++];
} else {
result[n--] = nums[right] * nums[right--];
}
}
return result;
}
}
易错点:第一次result[] 定义时长度取的nums.length-1导致下标越界
题目链接:209.长度最小的子数组
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
解题思路:看到这道题目的第一感觉没那么简单,连续子数组,就可以从数组第一个元素遍历,直到找到一个大于target的子数组然后统计长度,接着从第二个元素重复上面的操作,比较找到的数组的长度,直到找到长度最小的数组,然后返回长度。看了视频后发现滑块窗口真香哈哈
class Solution {
public int minSubArrayLen(int s, int[] nums) {
int left = 0;
int sum = 0;
// 不符合情况会返回0
int result = Integer.MAX_VALUE;
for (int right = 0; right < nums.length; right++) {
sum += nums[right];
while (sum >= s) {
result = Math.min(result, right - left + 1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
易错点:没想到未符合条件如何返回,结果发现给给默认值即可
题目链接:59.螺旋矩阵II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
解题思路:其实考察的还是区间,边界条件。认准[left,right),loop=n/2,因为循环一次,高度减少2,直到等于0,循环了n/2次。i和j的初始值要注意赋值。
class Solution {
public int[][] generateMatrix(int n) {
int startX =0;
int startY =0;
int loop = n/2;
int offset = 1;
int count = 1;
int[][] result = new int[n][n];
while(loop-->0) {
int i =startX;
int j=startY;
// 从左往右
// [left,right),right = n-offset,
for (j = startY; j < n - offset; j++) {
result[i][j] = count++;
}
// 从上往下
for(i = startX;i<n-offset;i++){
result[i][j] = count++;
}
// 从右往左
for(;j>=offset;j--){
result[i][j] = count++;
}
// 从下往上
for(;i>=offset;i--){
result[i][j] = count++;
}
startX++;
startY++;
offset++;
}
if(n%2!=0){
result[n/2][n/2] = n*n;
}
return result;
}
}
螺旋矩阵还是有点没完全整明白,需要再捣鼓捣鼓