最简单的办法,直接从两端比较,用if判断哪边的计算结果大,就给新数组放哪边的计算结果,并且移动该指针。以此反复。
class Solution {
public int[] sortedSquares(int[] nums) {
int[] ints=new int[nums.length];
int left=0;
int right=nums.length-1;
for(int i=ints.length-1;i>=0;i--){
if(nums[left]*nums[left]>=nums[right]*nums[right]){
ints[i]=nums[left]*nums[left];
left++;
}
else {
ints[i]=nums[right]*nums[right];
right--;
}
}
return ints;
}
}
for循环里的j控制的是终止位置,起始位置i是用指针的方式来控制:
For的作用是每次都加一个窗口(最右边的值),while的作用是在满足窗口里的值>= target的时候考虑是否需要减去最左边的一个窗口(最左边的值)。在while里需要逻辑判断:得到此时的窗口大小和以前的窗口大小的最小值!
技巧:要找最小值,就先给 result最大值:int result=Integer.MAX_VALUE;
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i=0;
int sum=0;
int result=Integer.MAX_VALUE;
for(int j=0;j<nums.length;j++){
sum+=nums[j];
while(sum>=target){
int subLength=j-i+1;
result=Math.min(result,subLength);
sum-=nums[i];
i++;
}
}
return result==Integer.MAX_VALUE?0:result;
}
}
相关题目推荐:904.水果成篮(opens new window) & 76.最小覆盖子串(opens new window)
class Solution {
public int[][] generateMatrix(int n) {
int l = 0, r = n - 1, t = 0, b = n - 1;
int[][] ints = new int[n][n];
int num = 1, cal = n * n;
while(num <= cal){
for(int i = l; i <= r; i++) ints[t][i] = num++;
t++;
for(int i = t; i <= b; i++) ints[i][r] = num++;
r--;
for(int i = r; i >= l; i--) ints[b][i] = num++;
b--;
for(int i = b; i >= t; i--) ints[i][l] = num++;
l++;
}
return ints;
}
}
类似题目:54.螺旋矩阵 & 剑指Offer 29.顺时针打印矩阵