No.1
题目
思路
- 数组本身是非降序,即最小值和最大值在数组的两端
- 非降序数组每个元素平方后,最大值在两端,最小值在中部
- 双指针比较数组两端最大值的大小,提取出最大的。移动双指针,然后得到次大,次次大,逐步得到结果
- 注意left==right是有意义的,即待处理数组只有一个元素,就是最中间(也是最小)的元素
代码
public static int[] sortedSquares(int[] nums) {
int len = nums.length;
int left = 0, right = len - 1;
int[] res = new int[len];
int res_index = len - 1;
while (left <= right && res_index >= 0) {
int sq_left = nums[left] * nums[left];
int sq_right = nums[right] * nums[right];
// 选大的,写入res数组
if (sq_left > sq_right) {
res[res_index--] = sq_left;
left++;
} else {
res[res_index--] = sq_right;
right--;
}
}
return res;
}
No.2
题目
思路
- 双指针控制子数组窗口
- 数字从窗口右边入,左边出
- 从整体的数组来看,right是一直在向右滑动的,可以用for循环来控制right递增
代码
public int minSubArrayLen(int target, int[] nums) {
int len = nums.length;
int sum = 0, min = Integer.MAX_VALUE;
int left = 0, right = 0;
for (; right < len; right++) {
sum += nums[right];
while (sum >= target) {
int windowLength = right - left + 1;
min = Math.min(min, windowLength);
sum -= nums[left++];
}
}
return min == Integer.MAX_VALUE ? 0 : min;
}
No.3
题目
思路
- 一个变量控制递增的数字
- 定义好边界
- 考虑奇偶边长
- 严格遵守边界定义,依照定义填充数字
- 注意起始位置
代码
int[][] matrix = new int[n][n];
int num = 1;
for (int i = 0; i < n / 2; i++) {
// RIGHT, j: column
for (int j = i; j < n - i - 1; j++) {
matrix[i][j] = num++;
}
// DOWN, j: row
for (int j = i; j < n - i - 1; j++) {
matrix[j][n - i - 1] = num++;
}
// LEFT, j: column
for (int j = n - i - 1; j > i; j--) {
matrix[n - i - 1][j] = num++;
}
// UP, j: row
for (int j = n - i - 1; j > i; j--) {
matrix[j][i] = num++;
}
}
if (n % 2 != 0) {
matrix[n / 2][n / 2] = num;
}
return matrix;
标签:right,nums,int,res,列表,++,刷题,Leetcode,left
From: https://www.cnblogs.com/tomatoQt/p/17517974.html