思路:有序数组考虑双指针,由于最大值之可能在两端,使用首尾指针法比较
java:
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int i = nums.length - 1;
int[] new_nums = new int[nums.length];
while(left <= right){
if(nums[left] * nums[left] < nums[right] * nums[right]){
new_nums[i--] = nums[right] * nums[right];
right--;
} else {
new_nums[i--] = nums[left] * nums[left];
left ++;
}
}
return new_nums;
}
}
java查漏补缺:
i++
返回递增前的值。即使用i++
时,表达式的结果为i
的原始值,之后i
增加 1。++i
返回递增后的值。即使用++i
时,表达式的结果为i
增加 1 后的值。
学习要点:滑动窗口来减少一层循环,只用循环终止位置,移动起始位置来找到最小值
java:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int right = 0 ; right < nums.length; right++){
sum += nums[right];
while(sum >= target){
int sublen = right - left -1;
result = Math.min(result, right-left+1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
螺旋矩阵:要点循环不变量原则,保证每次循环边界保持一致(此处选择左闭右开),每次循环只变循环开始的位置,不改变循环的方式。
class Solution {
public int[][] generateMatrix(int n) {
int startx= 0, starty = 0;
int offset = 1; //每一层末尾
int loop = 0 ; //层数
int cnt = 1;// 填充的数字
int[][] result = new int[n][n];
while(loop++ < n/2){
int i = startx;
int j = starty;
for(j = starty; j<n-offset; j++){
result[i][j] = cnt++;
}
for(i = startx; i < n-offset; i++){
result[i][j] = cnt++;
}
for(;j > starty; j--){
result[i][j] = cnt++;
}
for(;i > startx; i--){
result[i][j] = cnt++;
}
startx++;
starty++;
offset++;
}
if(n%2 ==1){
result[n/2][n/2] = cnt;
}
return result;
}
}