977.有序数组的平方
题目:给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
思路:双指针法
输入非递减排序的数组,平方都是正数。最大值取自输入数组的最左、或最右,可以使用双指针。left指针指向最左端,right指针指向最右端,创建一个和nums等大的数组result存放平方。最左端和最右端平方和大的放到result中。
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length;
int k = len - 1;
int[] result = new int[len];
int left = 0, right = len - 1;
while (left <= right) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
result[k--] = nums[left] * nums[left];
left++;
} else {
result[k--] = nums[right] * nums[right];
right--;
}
}
return result;
}
}
209.长度最小的子数组
题目:给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
思路:滑动窗口法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len = nums.length;
int sum = 0;
int slow = 0;
int min = Integer.MAX_VALUE;
for (int fast = 0; fast < len; fast++) {
sum += nums[fast];
while (sum >= target) {
min = Math.min(min, fast - slow + 1);
sum -= nums[slow];
slow++;
}
}
return min <= len ? min : 0;
}
}
注意点:
- min初始化为Integer.MAX_VALUE
- 和大于等于target后,才能计算最小长度,最小长度为fast - slow + 1
59.螺旋矩阵Ⅱ
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
class Solution {
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int startx = 0, starty = 0;
int loop = n / 2;
int mid = n / 2;
int count = 1;
int offset = 1;
int i, j;
while(loop-- > 0) {
for (j = starty; j < n - offset; j++) {
result[startx][j] = count++;
}
for (i = startx; i < n - offset; i++) {
result[i][j] = count++;
}
for (; j > starty; j--) {
result[i][j] = count++;
}
for (;i > startx; i--) {
result[i][j] = count++;
}
offset++;
startx++;
starty++;
}
if (n % 2 == 1) {
result[mid][mid] =count;
}
return result;
}
}