977题为常规双指针排序题:本题采用两种方法解答,暴力法省去主要探讨双指针做法,其难点在于理解给出的数组为非递减数组。根据此条件可以判断,在数组中的最大数只能位于数组的两端。在此条件下设置双向指针,创建新数组将最大的数一个一个放进来。
代码如下:
int i = 0;
int j = nums.length-1;
int [] fin = new int[nums.length];
int k = fin.length-1;
while (i<=j){
if (nums[i]*nums[i]>=nums[j]*nums[j]){
fin[k] = nums[i]*nums[i];
k--;
i++;
}else {
fin[k] = nums[j]*nums[j];
k--;
j--;
}
}
return fin;
209题为滑动窗口经典题型:
这个是今天看完视频学会的,核心问题在于进入循环体的是滑动窗口的结束位置,而且在循环里还有一个循环控制滑动窗口的开始位置,感觉不是很高效(有大神会一个循环结束的@我一下)代码如下:
int i = 0;
int sum = 0;
int subL = nums.length+1;
for (int j=0;j<nums.length;j++){
sum +=nums[j];
while (sum>=target){
if (subL>j-i+1){subL = j-i+1;}
sum-=nums[i];
i++;
}
}
if (subL==nums.length){return 0;}
return subL;
这里有个细节就是初始的subL的设置要大于给定的数组长度,否则不太好控制输出条件。
59题是真的麻烦,看着简单但是做起来还是有难度的。
首先就是设置跳出循环的条件,我就没有想到是转几圈,但是这确实是最好的方法。其次就是进入循环后的坐标设置从左往右以及从右往左的时候不变横坐标,这个也是关键。最后的细节是当给的数为单数时要注意最中间的数需要自己设定。因为我们的代码是左闭右开的。代码如下:
int [][] fin = new int[n][n];
int num = 1;
int count = 0;
int loop = 0;
int i,j;
while (loop++<n/2){
for (j=count;j<n-loop;j++){
fin[count][j] = num++;
}
for (i=count;i<n-loop;i++){
fin[i][j] = num++;
}
for (;j>=loop;j--){
fin[i][j] = num++;
}
for (;i>=loop;i--){
fin[i][j] = num++;
}
count++;
}
if (n%2==1){
fin[n/2][n/2]=num;
}
return fin;