LeetCode977 有序数组的平方
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int[] res = new int[nums.length];
int index = nums.length - 1;
while(left<=right){
if(nums[left]*nums[left]>nums[right]*nums[right]){
res[index--] = nums[left] * nums[left];
left++;
}else{
res[index--] = nums[right] * nums[right];
right--;
}
}
return res;
}
}
LeetCode209 长度最小的字数组
题目链接:209.长度最小的字数组
关键词:连续子数组 思路:滑动窗口法
● 补充的基础知识:
- int的最大值:Integer.MAXVALUE;
- 每一次从i开始计算子数组元素总和,都要初始化sum = 0;
- 考虑无解的情况,result = 0;
(1)暴力解法(双层循环)
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE; //取最大值,便于比较时用较小值替代
int len = 0;
for(int i = 0;i< nums.length;i++){
int sum = 0;
for(int j=i; j< nums.length;j++){
sum += nums[j];
if(sum>=target){
len = j-i+1;
//或者result = len<result?len:result;
result = Math.min(result, len);
break; //一旦找到就已经是最小数组,马上跳出内循环
}
}
}
return result == Integer.MAX_VALUE ? 0 : result; //别忽略数组不存在的情况
}
}
(2)滑动窗口法
● left从0开始,right++,sum累加循环直到满足sum>=target,确定窗口右界;
● 接着left++,缩小窗口左界。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE;
int len = 0;
int i = 0;
int sum = 0;
for(int j = 0;j< nums.length;j++){
sum += nums[j];
while(sum >= target){ //确定窗口右界
len = j-i+1;
result = Math.min(len,result);
sum -= nums[i++]; //缩小窗口左界
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
LeetCode59 螺旋矩阵ii
题目链接:59. 螺旋矩阵ii
思路:每一个for循环都遵循“左闭右开”,注意当n为奇数时单个不开启循环
class Solution {
public int[][] generateMatrix(int n) {
int start =0;
int loop = 0;
int index = 1;
int [][]res = new int[n][n];
int i,j; //要设置成全局变量
while(loop++ < n/2){
for(j=start;j<n-loop;j++){
res[start][j] = index++;
System.out.println("for1:"+start+" "+j);
}
for(i=start;i<n-loop;i++){
res[i][j] = index++;
System.out.println("for2:"+i+" "+ j);
}
for(;j>=loop;j--){
res[i][j] = index++;
System.out.println("for3:"+i+" "+j);
}
for(;i>=loop;i--){
res[i][j] = index++;
System.out.println("for4:"+i+" "+j);
}
start++;
}
if(n%2 ==1){
res[n/2][n/2]=n*n;
}
return res;
}
}