代码随想录算法训练营第二天 | 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵Ⅱ

LeetCode 977 有序数组的平方

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

  看到题目提示,双指针。哎这个我昨天学过,从两边开始呗,只需要把负数平方,和后边比插入前边。于是动手开始在本子上写着模拟过程,但是每次比完还得移动大量的改变之后的位置。实在想不出来感觉自己还是太菜了!
  然后,去看代码随想录这一题的思路,哎竟然再加一个数组就好了,我天加一个数组能省这么多步骤。我怎么没这么想过,这个好强哈。看完之后写出下边代码。一次过哈哈哈哈。

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] T = new int [nums.length]; //初始化一个临时数组存放结果
        int t = nums.length - 1;
        int leftIndex = 0, rightIndex = nums.length - 1;
        while(leftIndex <= rightIndex ){
            if(nums[leftIndex]*nums[leftIndex] < nums[rightIndex] * nums[rightIndex] ){
               T[t--] = nums[rightIndex] * nums[rightIndex];
               rightIndex--;
            }else{
                T[t--] = nums[leftIndex] * nums[leftIndex];
                leftIndex++;

            }
        }
        return T;
    }
}

LeetCode 209 长度最小的子数组

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

这一题看完想了10分钟,脑子什么都模拟不出来,暴力求出所有的子数组也想不出来。
脑子里想还是不靠谱。于是,去看了下视频,自己这次在本子上写了大概代码,感觉没问题。提交,不通过。发现自己想的还是简单了,没考虑到总和也小于target的情况。
还是要多学习,前辈们总结的方法学以致用。我们要自己能想出来最优解,那就太天才了,不过就算想出来也是前人,早已发现的。所以,暂时没必要花太多时间去考虑那些。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int minLength = 0;
        int result = Integer.MAX_VALUE;
        int j = 0, i = 0,sum = 0;
        for(;j < nums.length;j++){
                sum += nums[j];
            while(sum>=target){
                minLength = j - i + 1;
                result = result < minLength ? result : minLength;
                sum -= nums[i];
                i++;
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

我对滑动窗口的理解:也是循环套了个循环,不过第二个循换加上了条件,所以省去了很多不必要的过程,从而降低时间复杂度。

LeetCode 59 螺旋矩阵II

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

模拟过程题,这一题再一次验证了区间的划分合理性,和不变性的重要。如果不合理写,就会不断地判断各种条件。感谢前人思考总结的办法。

class Solution {
    public int[][] generateMatrix(int n) {
        int loop = 0;
        int[][] res = new int[n][n];
        int start = 0;
        int count = 1;
        int i = 0,j = 0;
        while(loop++ < n/2){
            for(j=start; j< n-loop;j++){
                res[start][j] = count++;
            }
            for(i=start; i< n-loop;i++){
                res[i][j] = count++;
            }
            for(;j>=loop;j--){
                res[i][j] = count++;
            }
             for(;i>=loop;i--){
                res[i][j] = count++;
            }
            start++;
        }
        if (n%2 == 1){
            res[start][start] = count;
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值