代码随想录算法训练营第2天|LeetCode 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
977.有序数组的平方
题目链接:有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 已按 非递减顺序 排序
暴力求解
代码如下(Java):
public static int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i] * nums[i];
}
Arrays.sort(nums); //快排
return nums;
}
双指针
代码如下(Java):
public static 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];
i++;
} else {
result[k--] = nums[j] * nums[j];
j--;
}
}
return result;
}
209.长度最小的子数组
题目链接:长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:
输入:target = 4, nums = [1,4,4]
输出:1示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0提示:
- 1 <= target <= 109
- 1 <= nums.length <= 105
- 1 <= nums[i] <= 105
滑动窗口
代码如下(Java):
public static int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE;
int left = 0, sum = 0; //left为起始位置
for (int right = 0; right < nums.length; right++) { //只要sum小于target 则将终止下标位置往右移 right为终止位置
sum += nums[right];
while (sum >= target) { //只要sum大于等于target 则将起始下标位置往右移
result = Math.min(result, right - left + 1); //将新长度与原来比较取最小
sum -= nums[left++]; //减去最起始位置nums的值并将起始下标右移一位
}
}
return result == Integer.MAX_VALUE ? 0 : result; //检查初始值 排除所有元素之和小于target的情况
}
59.螺旋矩阵II
题目链接:螺旋矩阵II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:
输入:n = 1
输出:[[1]]提示:
- 1 <= n <= 20
边界控制
思路:
- 需要循环n/2圈 若n为奇数时,最后一圈一定是一个数(即nums[mid] [mid]),直接赋值即可
- 没循环一圈起始位置都要+1 例如第一圈(starX,starY) = (0,0) -> (1,1)
- 边界长度每转一圈加1(即移动四周边界)
代码如下(Java):
public int[][] generateMatrix(int n) {
int[][] nums = new int[n][n];
int starX = 0, starY = 0; //循环每一圈的起始位置
int offset = 1; //控制边界长度
int i, j;
int count = 1; //给数组赋值
int loop = 0; //循环的圈数
int mid = n / 2; //最中间位置的数为nums[n][n]
while (loop++ < n / 2) {
i = starX;
j = starY;
// 模拟填充上行从左到右(左闭右开)
for (; j < n - offset; j++) {
nums[starX][j] = count++;
}
// 模拟填充右列从上到下(左闭右开)
for (; i < n - offset; i++) {
nums[i][j] = count++;
}
// 模拟填充下行从右到左(左闭右开)
for (; j > starX; j--) {
nums[i][j] = count++;
}
// 模拟填充左列从下到上(左闭右开)
for (; i > starY; i--) {
nums[i][j] = count++;
}
//起始位置要各自加1
starX++;
starY++;
offset++;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2 == 1) {
nums[mid][mid] = count;
}
return nums;
}