代码随想录算法训练营第二天| 螺旋数组

 


    977. 有序数组的平方

这道题我犯了一个错误,就是arr[index] = nums[left++]*nums[left++],这是一个致命的错误,因为他将left加了两次1,一开始我还忘记平方了!    还有忘记了在if语句的条件判定中也要是两个数的平方进行比较!

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

59. 螺旋矩阵 II

这道题我之前做过两次了花费了很多时间,这次做依然出现了一些问题

问题一:在每次循环之后忘记将num加1   这个会导致这个数组尽管是以螺旋形式添加的,但是每个数组都是1,并且循环无法退出!!!!!!!!!!!!!!!!!!!!!!!!!!!

问题二:边界问题,我这个思路是按照leetcode题解有个大佬的题解来进行的,所以是每一行遍历结束要往里压缩边界,上边界和左边界是加1     下边界和右边界是减1

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] mat= new int [n][n];
        int l = 0,r = n - 1 ,u = 0 ,d = n - 1;
        int num = 1;
        while(num<=(n*n)){
            for(int i = l;i<=r;i++){
                mat[u][i] = num++;
                
            }
            u++;
            for(int i = u;i<=d;i++){
                mat[i][r] = num++;
                
            }
            r--;
            for(int i = r;i>=l;i--){
                mat[d][i] = num++;
                
            }
            d--;
            for(int i = d;i>=u;i--){
                mat[i][l] = num++;
                
            }
            l++;


        }
        return mat;
    }

}

 

209. 长度最小的子数组

这道题做过但是有思路,代码能力太差,忘记具体步骤

问题一:一定要记得result = Integer.MAX_VALUE   这个可以获得int类型的最大值! 

问题二:滑动窗口的精髓在于每个数只操作了两次,进来一次出去一次,

进的操作由快指针fast操作,出的操作由慢指针操作

还有就是将记录的数加起来的总和sum     

这个数快指针的操作加,慢指针的操作减

还要记得每次慢指针操作时要记得将总和sum最小的结果result相比较取其中偏小的!

最后如果result没有操作   说明要返回而不是Integer.MAX_VALUE

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int fast = 0;
        int slow = 0;
        int result = Integer.MAX_VALUE;
        int sum = 0;
        for(fast = 0;fast<nums.length;fast++){
            sum += nums[fast];

            while(sum>=target){
                result = Math.min(result,fast-slow+1);
                sum-=nums[slow];
                slow++;

            }
        }
        if(result == Integer.MAX_VALUE){
            return 0;
        }
        return result;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值