代码随想录算法训练营Day2
977.有序数组的平方
977.有序数组的平方
给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
- 暴力排序
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length]; // 定义新数组用来存放结果
for (int i = 0; i < nums.length; i++) { // 都平方
res[i] = nums[i] * nums[i];
}
Arrays.sort(res); // 排序
return res;
}
}
- 双指针
双指针需要考虑的是两边最大值的比较,时间复杂度为O(n);
class Solution {
public int[] sortedSquares(int[] nums) {
int right = nums.length - 1;
int left = 0;
int[] result = new int[nums.length];
int index = result.length - 1;
while (left <= right) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
// 正数的相对位置是不变的, 需要调整的是负数平方后的相对位置
result[index--] = nums[left] * nums[left];
++left;
} else {
result[index--] = nums[right] * nums[right];
--right;
}
}
return result;
}
}
209.长度最小的子组
209.长度最小的子组
给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
输入:target = 4, nums = [1,4,4]
输出:1
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
- 暴力
class Solution {
public int minSubArrayLen(int s, int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
int ans = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = i; j < n; j++) {
sum += nums[j];
if (sum >= s) {
ans = Math.min(ans, j - i + 1);
break;
}
}
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}
}
- 滑动窗口
class Solution {
// 滑动窗口
public int minSubArrayLen(int s, int[] nums) {
int left = 0; // 窗口起始位置
int sum = 0; // 窗口数值之和
int result = Integer.MAX_VALUE;
for (int right = 0; right < nums.length; right++) {
sum += nums[right];
// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
while (sum >= s) {
result = Math.min(result, right - left + 1); // 记录最小长度
sum -= nums[left++]; // 变更起始位置
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == Integer.MAX_VALUE ? 0 : result;
}
}
59.螺旋矩阵II
螺旋矩阵II
给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
输入:n = 1
输出:[[1]]
class Solution {
public int[][] generateMatrix(int n) {
int left = 0, right = n-1, top = 0, bottom = n-1; // 定义边界
int count = 1, target = n * n; // 初始值和终止值
int[][] res = new int[n][n];
// 对于变量的边界怎么定义:
// 从左向右填充:填充的列肯定在[left,right]区间
// 从上向下填充:填充的行肯定在[top,bottom]区间
// 从右向左填充:填充的列肯定在[right,left]区间
// 从下向上填充:填充的行肯定在[bootom,top]区间
while (count <= target) {
// 从左到右填充,相当于缩小上边界
for(int j = left; j <= right; j++) res[top][j] = count++;
// 缩小上边界
top++;
// 从上向下填充,相当于缩小右边界
for(int i = top; i <=bottom; i++) res[i][right] = count++;
// 缩小右边界
right--;
// 从右向左填充,相当于缩小下边界
for(int j = right; j >= left; j--) res[bottom][j] = count++;
// 缩小下边界
bottom--;
// 从下向上填充,相当于缩小左边界
for(int i = bottom; i >= top; i--) res[i][left] = count++;
// 缩小左边界
left++;
}
return res;
}
}