算法练习 Day2 | leetcode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

算法题

977.有序数组的平方

题目链接

class Solution {
    public int[] sortedSquares(int[] nums) {
        //双指针法——左右指针
        int k=nums.length-1;
        //注意数组初始化
        int[] result=new int[nums.length];
        for(int i=0,j=nums.length-1;i<=j;){
            if(nums[i]*nums[i]>nums[j]*nums[j]){
                result[k]=nums[i]*nums[i];
                k--;
                i++;
            }
            else{
                result[k]=nums[j]*nums[j];
                k--;
                j--;
            }

        }
        return result;

    }
}

注意:

  1. 数组初始化
  2. for循环的循环终止条件 i<=j
  3. nums[i] = nums[j] 的情况
  4. 使用方法:双指针—左右指针,因为分析题目特性可知最大值在数组两边,最小值在数组中间

 

209.长度最小的子数组

题目链接

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int lens=Integer.MAX_VALUE;//最大值
        int i=0;//起始
        int sum=0;
        for(int j=0;j<nums.length;j++){
            sum+=nums[j];
            while(sum>=target){
                lens=Math.min(lens,j-i+1);
                sum-=nums[i];
                i++;
            }
        }
        if(lens==Integer.MAX_VALUE){
            return 0;
        }
        return lens;

    }
}

滑动窗口

适用条件:求某个子串或者子序列最长最短等最值问题或者求某个目标值时

注意:

  • 重点:滑动窗口的起始位置
  • 核心:双指针
  • i 是滑动窗口的起始位置,j 是滑动窗口里面的终止位置
  • 为了避免与暴力解法相同,for循环里面的 j 一定指向的是终止位置,而且只需要一个for循环,起始位置i 用动态移动的方式来改变起始位置。
  • 终止位置 j 随着for循环向后移动,当sum>=target时,说明已经找到满足条件的长度,收集该长度,开始移动起始位置。

59.螺旋矩阵II

题目链接

class Solution {
    public int[][] generateMatrix(int n) {
        //每次循环的起始下标
        int x=0;
        int y=0;
        //用于填充的数字
        int count=1;
        //数组
        int [][] result=new int[n][n];
        //循环的次数
        int loop=n/2;
        // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
        int offset=1;
        //循环过程中用于操作x,y轴的变量
        int i=0;
        int j=0;

        while(loop>0){
            loop--;
            //不能是j=0,如果j=0的话那在结束第一层后无法进入第二层
            //因为j还是从0开始,意味着还是从第一列开始循环,而第二层要从第二列开始
            //j<n-offset 没有等于是因为用的是“左闭右开”的方式
            for(j=y;j<n-offset;j++){
                result[x][j]=count;
                count++;
            }
            for(i=x;i<n-offset;i++){
                result[i][j]=count;
                count++;
            }
            
            for(;j>y;j--){
                result[i][j]=count;
                count++;
            }
            
            for(;i>x;i--){
                result[i][y]=count;
                count++;
            }
            x++;
            y++;
            offset++;

        }
        //result[n/2][n/2]这个位置是矩阵中心位置
        if(n%2==1){
            result[n/2][n/2]=count;
        }
        return result;

    }
}

注意:

这里的边界用“左闭右开”的方式选择 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值