算法笔记|Day2数组基础II

☆☆☆☆☆leetcode 977.有序数组的平方

题目链接:leetcode 977.有序数组的平方

题目分析

1.采用双指针法,非递减数组平方后最大的元素一定为第一个元素或者最后一个元素的平方,依次比较即可;
2.时间复杂度为O(n),空间复杂度为O(n)。

代码

class Solution {
    public int[] sortedSquares(int[] nums) {
        int res[]=new int[nums.length];
        int left=0,right=nums.length-1;
        int n=nums.length-1;
        for(left=0,right=nums.length-1;left<=right;){
            if(nums[left]*nums[left]<nums[right]*nums[right]){
                res[n]=nums[right]*nums[right];
                n--;
                right--;
            }else{
                res[n]=nums[left]*nums[left];
                n--;
                left++;
            }
        }
        return res;
    }
}

提示:int res[]=new int[nums.length];创建了一个名为 res 的新整型数组,其大小与已存在的整型数组 nums 相同

☆☆☆☆☆leetcode 209.长度最小的子数组

题目链接:leetcode 209.长度最小的子数组

题目分析

1.滑动窗口法,本质和双指针类似,不断调节子序列的起始位置和终止位置;
2.时间复杂度为O(n),空间复杂度为O(1)。

代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left=0,right=0,sum=0,res=Integer.MAX_VALUE;
        for(right=0;right<=nums.length-1;right++){
            sum+=nums[right];
            while(sum>=target){
                res=res<right-left+1?res:right-left+1;//可写为res=Math.min(res,right-left+1);
                sum-=nums[left];
                left++;
            }
        }
        return res==Integer.MAX_VALUE?0:res;
    }
}

提示:Integer.MAX_VALUE 是 Java中一个静态常量,代表 int类型能够表示的最大值。在 Java中,int类型是一个 32位有符号整数,因此它的取值范围是从 -231到 231-1。具体地,Integer.MAX_VALUE的值是 231-1,即 2147483647。

☆leetcode 904.水果成篮(待补充)

题目链接:leetcode 904.水果成篮

题目分析

代码


☆leetcode 76.最小覆盖子串(待补充)

题目链接:leetcode 76.最小覆盖子串

题目分析

代码


☆☆☆☆☆leetcode 59.螺旋矩阵II

题目链接:leetcode 59.螺旋矩阵II

题目分析

1.对于大小为n×n的螺旋矩阵,需要循环n/2圈(n为奇数时,向下取整,并对中心位置的元素单独赋值),这里用loop表示循环圈数,每次循环方向如下图;
2.采用左闭右开区间,以保证每一个位置赋值不重不漏,startx表示每次循环x方向的开始位置,starty表示每次循环y方向的开始位置,offset(偏移量)辅助计算每次循环的开始或者结束位置;
3.时间复杂度 O(n2),空间复杂度 O(1)。
Alt

代码

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] nums = new int[n][n];
        int startx=0,starty=0,offset=1,count=1,loop=1;
        int i,j;
        while(loop<=n/2){
            for(j=starty;j<n-offset;j++){
                nums[startx][j]=count++;
            }
            for(i=startx;i<n-offset;i++){
                nums[i][j]=count++;
            }
            for(j=n-offset;j>starty;j--){
                nums[i][j]=count++;
            }
            for(i=n-offset;i>startx;i--){
                nums[i][j]=count++;
            }
            startx++;
            starty++;
            offset++;
            loop++;
            }
            if(n%2==1){
                nums[startx][starty]=count;
        }
        return nums;


    }
}

☆leetcode 54.螺旋矩阵(待补充)

题目链接:leetcode 54.螺旋矩阵

题目分析

代码


  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值