目录
977. 有序数组的平方
209. 长度最小的子数组
59. 螺旋矩阵 II
977. 有序数组的平方
977. 有序数组的平方
难度:easy
类型:双指针(相向指针)
思路:
暴力法是将每个数都平方后,再排序(快排),时间复杂度为O(logn)。我们采用双指针(相向指针,区别下一题的快慢指针)的方法,因为最大的平方数一定出现在数组首或尾,所以我们依次比较首位平方元素,从大到小来构建答案数组。
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length;
int[] result = new int[len];
int left = 0;
int right = len - 1;
for (int i = len - 1; i >= 0; i--) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
result[i] = nums[left] * nums[left];
left++;
} else {
result[i] = nums[right] * nums[right];
right--;
}
}
return result;
}
}
复杂度分析:
- 时间复杂度:O(n)
209. 长度最小的子数组
209. 长度最小的子数组
难度:easy
类型:双指针(快慢指针)
思路:
这道题也可以通过暴力法解决,用两个for循环遍历所有情况,时间复杂度为O(n^2)。我们通过双指针来实现滑动窗口来解决这道题。窗口内的和为sum,right指针向右移动,当sum大于等于target时,判断是否为最小长度;然后左指针向左移直到sum小于target。
细节:
ans取Integer.MAX_VALUE,有助于动态更新最小长度;
ans = Integer.MAX_VALUE
代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len = nums.length;
int left = 0;
int right = 0;
int sum = 0;
int ans = Integer.MAX_VALUE;
while (right < len) {
sum += nums[right++];
while (sum >= target) {
ans = Math.min(ans, right - left);
sum -= nums[left++];
}
}
return ans == Integer.MAX_VALUE? 0: ans;
}
}
复杂度分析:
- 时间复杂度:
- 空间复杂度:
59. 螺旋矩阵 II
59. 螺旋矩阵 II
思路:
设置四个边界,动态更新边界,这样可以避免设置左闭右开区间,没那么麻烦。
代码:
class Solution {
public int[][] generateMatrix(int n) {
int[][] ans = new int[n][n];
int left = 0;
int right = n - 1;
int up = 0;
int down = n - 1;
for (int element = 1; element <= n * n;) {
for (int i = left; i <= right; i++) {
ans[up][i] = element++;
}
up++;
for (int i = up; i <= down; i++) {
ans[i][right] = element++;
}
right--;
for (int i = right; i >= left; i--) {
ans[down][i] = element++;
}
down--;
for (int i = down; i >= up; i--) {
ans[i][left] = element++;
}
left++;
}
return ans;
}
}
复杂度分析:
- 时间复杂度:O(n),因为每个元素遍历了一遍