977.有序数组的平方
力扣题目链接:977.有序数组的平方
思路:首先看到题目的时候,会想到遍历而后排序的基本方法,这样做的时间复杂度和快速排序的复杂度一致,为O(nlogn)。题目已知数组是有序的,分析可以发现平方之后最大值在数组的两边(或者某一边),一定不在中间,因此考虑用双指针法,左右两指针所指的对象平方之后比较,将较大者放在新的数组中的后边,这样做可将时间复杂度降为O(n),代码如下:
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int[] result = new int[nums.length];
int index = nums.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--;
}
index--;
}
return result;
}
}
209.长度最小的子数组
力扣题目链接:209.长度最小的子数组
思路:刚看到题目的时候完全没有思路,可用暴力法解决,双指针法会将时间复杂度降为O(n)。
难点在于跟踪子数组的结尾索引。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int result = Integer.MAX_VALUE;
int i = 0;
for(int j = 0; j < nums.length; j++){
sum = sum + nums[j];
while(sum >= target){
result = Math.min(result,j - i + 1);
sum = sum - nums[i];
i++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
59.螺旋矩阵 二
力扣题目链接:59.螺旋矩阵2
思路:左闭右开区间
int[][] result = new int[n][n];
int loop = 1;//旋转次数
int start = 0;
int i, j;
int count = 1;
while(loop <= n /2){
for (j = start; j < n - loop; j++) {
result[start][j] = count;
count++;
}
for (i = start; i < n - loop; i++) {
result[i][j] = count;
count++;
}
for (;j > start; j--) {
result[n - loop][j] = count;
count++;
}
for (; i > start; i--) {
result[i][start] = count;
count++;
}
loop++;
start++;
}
if(n % 2 == 1){
result[n /2][n /2] = n * n;
}
return result;