- 数组平方 题目链接
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
思路:举一个只有三个元素的数组,平方后,最大值只会在左右两边产生,不会是中间元素,所以立马想到使用双指针:
class Solution {
public int[] sortedSquares(int[] nums) {
int k = nums.length - 1;
int[] result = new int[nums.length];
int left = 0, right = k;
while (left <= right) {
if (nums[left] * nums[left] < nums[right] * nums[right]) {
result[k--] = nums[right] * nums[right];
right--;
} else {
result[k--] = nums[left] * nums[left];
left++;
}
}
return result;
}
}
- 长度最小的子数组 题目链接
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
思路:滑动窗口
- 窗口的起始位置如何移动:如果当前窗口的值大于s,窗口向前移动(也就是窗口值缩小)
- 窗口的结束位置如何移动:如果当前窗口的值小于s,窗口向前移动(也就是窗口值增大);
- 窗口移动结束条件:窗口结束位置大于数组最后一个元素下标;
class Solution {
public int[] sortedSquares(int[] nums) {
int k = nums.length - 1;
int[] result = new int[nums.length];
int left = 0, right = k;
while (left <= right) {
if (nums[left] * nums[left] < nums[right] * nums[right]) {
result[k--] = nums[right] * nums[right];
right--;
} else {
result[k--] = nums[left] * nums[left];
left++;
}
}
return result;
}
}
- 螺旋矩阵 题目链接
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
思路:
- 模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上 - 画每四条边,按照固定规则来遍历,每画一条边都坚持一致的左闭右开
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
// 填进矩阵的值,逐次++
int val = 1;
// 遍历矩阵用的变量, i行位置,j列位置
int i, j;
// 起始位置
int startX = 0, startY = 0;
// 从起点到开始画一个圈算一次循环,则总循环次数为n/2
int loop = 0;
while (loop++ < n/2) {
i = startX;
j = startY;
// 上排从左到右,i不变j++
for(j = startY; j < n - loop; j++) {
matrix[i][j] = val++;
}
// 右排从上到下,j不变i++
for(i = startX; i < n - loop; i++) {
matrix[i][j] = val++;
}
// 下排从右到左,i不变j--;
for(;j >= loop; j--) {
matrix[i][j] = val++;
}
// 左排从下到上,j不变i--;
for(;i >= loop; i--) {
matrix[i][j] = val++;
}
// 进入下一圈循环
startX++;
startY++;
}
// n为奇数,单独处理矩阵中间元素
if (n % 2 == 1) {
matrix[startX][startY] = n * n;
}
return matrix;
}
}