Day2数组进阶
题目
梳理
977
解法:
本题的最佳解法为双指针,一前一后,哪个更大放入结果数组中。此时的时间复杂度为o(n)
209
解法:
本体最好使用队列,不然会超时。
59
点评:本题考察的是对数组边界的控制能力,在我这里比上面 两题都要难。
代码
977
class Solution {
public int[] sortedSquares(int[] nums) {
int res[] = new int[nums.length];
int left = 0;
int right = nums.length - 1;
int count = nums.length - 1;
while(left<=right){
if(nums[left]*nums[left]<nums[right]*nums[right]){
res[count--] = nums[right]*nums[right];
right--;
}else {
res[count--] = nums[left]*nums[left];
left++;
}
}
return res;
}
}
209
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int end = -1;//栈尾
int top = -1;//栈顶
int tmp = 0;
int MinLength = 1000100;
Boolean flag = true;
while(top < nums.length - 1){
top++;
tmp += nums[top];
if(tmp >= target){
int len = top - end;
MinLength = MinLength > len ? len :MinLength;
while (tmp >= target){
flag = false;
end++;
len--;
tmp -= nums[end];
if(tmp >= target)
MinLength = MinLength > len ? len :MinLength;
}
}
}
if(flag)return 0;
return MinLength;
}
}
59
class Solution {
public static int[][] generateMatrix(int n) {
int loop = n / 2; // 循环的层数
int res[][] = new int[n][n];
int index = 0;
int len = n;
// 正常的范围,选定顺时针作为方向
for (int i = 0; i < loop; i++) {
// 第一轮
for (int l = i; l < len - i; l++) {
res[i][l] = ++index;
}
// 第二轮
for (int l = i + 1; l < len - i; l++) {
res[l][len - i - 1] = ++index;
}
// 第三轮
for (int l = len - i - 2; l >= i; l--) {
res[len - i - 1][l] = ++index;
}
// 第四轮
for (int l = len - i - 2; l > i; l--) {
res[l][i] = ++index;
}
}
// 对于奇数的补充处理
if (n % 2 == 1) {
res[loop][loop] = n * n;
}
return res;
}
}