💡 解题思路
- 📝 确定输入与输出
- 🔍 分析复杂度
- 🔨 复杂题目拆分 :严谨且完整 地拆分为更小的子问题
- 💭 选择处理逻辑: 根据拆分后的子问题,总结并选择合适的问题处理思路
- 🔎 检查特殊情况:边界条件和特殊情况
- 🏁 返回结果
977. 有序数组的平方有序数组的平方
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length;
if (len == 1) {
nums[0] = nums[0] * nums[0];
return nums;
}
// 记录最小值下标
int j = 0;
nums[0] = nums[0] * nums[0];
for (int i = 1; i < len; i++) {
nums[i] = nums[i] * nums[i];
if (nums[i] < nums[i-1]) j = i;
}
// 双指针记录结果
int k = j-1;
int[] result = new int[len];
result[0] = nums[j];
j++;
for (int i = 1; i < len; i++) {
if (k >= 0 && j < len) {
result[i] = nums[k] <= nums[j] ? nums[k--] : nums[j++];
} else if (k >= 0) {
result[i] = nums[k--];
} else if (j < len) {
result[i] = nums[j++];
}
}
return result;
}
}
209. 长度最小的子数组
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int counts = 0, result = Integer.MAX_VALUE;
int len = nums.length, left = 0, right = 0;
// 双指针
while(right < len) {
counts+=nums[right++];
// 循环,直到小于结果
while (counts >= target) {
result = Math.min(result, right-left);
counts -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
59. 螺旋矩阵 II
class Solution {
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int k = 1;
// 分析问题,分四个遍历状态(处理边界)
for (int i = 0; i < n/2; i++) {
// 状态1
for (int j = i; j < n - i; j++) { // 考虑边界
result[i][j] = k++; // 存放位置
}
// 状态2
for (int j = i+1; j < n - i; j++) {
result[j][n - 1 - i] = k++;
}
// 状态3
for (int j = n - i - 2; j >= i; j--) {
result[n - i - 1][j] = k++;
}
// 状态4
for (int j = n - i - 2; j > i; j--) {
result[j][i] = k++;
}
}
// 处理特殊情况
if (n % 2 == 1) result[n/2][n/2] = n*n;
return result;
}
}