“你就像一个螺旋矩阵”
|977.有序数组的平方
平方后:最大元素在两边
class Solution {
public int[] sortedSquares(int[] nums) {
int right = nums.length-1;
int[] arrays = new int[nums.length];
int len = nums.length-1;
int left = 0;
while(left<=right){//left==right时也会取一个元素,有意义的
if(nums[left]*nums[left]>nums[right]*nums[right]){
arrays[len--] = nums[left]*nums[left];
left++;
}//可以用Math.pow(x,2)】
else{
arrays[len--] = nums[right]*nums[right];
right--;
}
}
return arrays;
}
}
209.长度最小的子数组
//注意1e5返回的是double值,不是int类型的
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int start = 0;
int minLen = Integer.MAX_VALUE;
int len = 0;
for(int j = 0;j<nums.length;j++){
//j表示终止位置
sum+=nums[j];
while(sum>=target){
//终止位置确定,移动起始位置是关键
len = j - start+1;
if(len<minLen){
minLen = len;
}
//这里可以改进:
//minLen = Math.min(minLen,j-start+1);
sum -= nums[start++];
}
}
if(minLen== Integer.MAX_VALUE){
return 0;
}
else
return minLen;
}
//improvement:
//minLen = minLen==Integer.MAX_VALUE?0:minLen
}
//改进之后的代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int start = 0;
int minLen = Integer.MAX_VALUE;
int j = 0;
while(j<nums.length){
sum += nums[j];
while(sum>=target){
int curLen = j -start+1;
minLen =Math.min(curLen,minLen);
sum -= nums[start++];
}
j++;
}
return minLen==Integer.MAX_VALUE?0:minLen;
}
}
59.螺旋矩阵II
每条边处理的边界原则都一样
还要解决转几圈的问题,这个是根据规律发现的:n/2
接着就是一些小细节的问题了
注意每次循环要跟着你这个代码的思路来
我们习惯用(i,j)表示坐标
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int loop = n/2;//总圈数
int start = 0;//startX = startY
int offset = 1;
int num = 1;
int i,j;//这样可以记录我们的程序进行到哪一步了
while(loop>0){
for(j = start;j<n-offset;j++){
matrix[start][j] = num++;
}
for(i = start;i<n-offset;i++){
matrix[i][j] = num++;
}
for(;j>=offset;j--){
matrix[i][j] = num++;
}
for(;i>=offset;i--){//这里最容易错,要等于
matrix[i][j] = num++;
}
loop--;//圈数-1
start++;//起始点+1
offset++;//起始点+1意味着边界+1
}
if(n%2==1){
matrix[n/2][n/2] = num;
}
return matrix;
}
}