代码随想录02day
前言
提示:每一天要有固定的流程,别浪费时间
一、力扣977有序数组的平方
提示:数组中有负数存在,平方后,两头大中间小,类似一个倒金字塔,采用双指针,从两端开始比较,每次选出最大的那一个数,将它放入新数组之中
class Solution {
public int[] sortedSquares(int[] nums) {
int[] arr = new int[nums.length];
for(int i=0,j=nums.length-1,k=j;i<=j;){
int a = nums[i]*nums[i], b = nums[j]*nums[j];
if(b>=a){
arr[k--] = b;j--;
}else{
arr[k--] = a;i++;
}
}
return arr;
}
}
二、力扣209长度最小的子数组
1.暴力解法
代码如下(示例):两个指针i,j,数组索引i充当起始位置,自由指针j充当终止位置,就相当于两个for循环,其实还是遍历了一遍,复杂度on2
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i=0,j=0,low=0,high=0,min, temp=0;
for(int a=0;a<nums.length;a++){
temp+=nums[a];
}
if(temp<target){
return 0;
}
min = nums.length;
for(;i<=nums.length-1&&j<=nums.length-1;){
int sum = nums[j];
while(sum<target&&j<nums.length-1){
sum+=nums[++j];
}
if(sum>=target&&j-i+1<min){
low=i;high=j;min=high-low+1;
}
i++;j=i;
}
return min;
}
}
2.滑动窗口
代码如下(示例):滑动窗口的主要思想就是寻找连续的子序列,滑动窗口的起始位置和终止位置的确定十分重要,要保证窗口不会发生回溯,此题每个元素只滑进窗口一次,滑出窗口一次
滑动窗口要点有三
窗口是什么?
如何移动窗口的起始位置?
如何移动窗口的结束位置?
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0, rigth = 0, min = Integer.MAX_VALUE;
int sum = 0;
for(;rigth < nums.length;rigth++){
sum += nums[rigth];
while(sum>=target){
int len = rigth-left+1;
sum-=nums[left++];
min = len<min?len:min;
}
}
return min == Integer.MAX_VALUE ?0:min;
}
}
三、力扣209长度最小的子数组
循环中判断的边界条件比较多,要确定循环中的变量和不变量
class Solution {
public int[][] generateMatrix(int n) {
int[][] arr = new int[n][n];
int a = 0, b = n-1, c = n-1, d = 0, sum = 1;
while(sum<=n*n){
for(int i=d;i<=b;i++){
arr[a][i] = sum++;
}
a++;
for(int i=a;i<=c;i++){
arr[i][b] = sum++;
}
b--;
for(int i=b;i>=d;i--){
arr[c][i] = sum++;
}
c--;
for(int i=c;i>=a;i--){
arr[i][d] = sum++;
}
d++;
}
return arr;
}
}
总结
今天有点磨叽,明天要节约时间