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

977.有序数组的平方

977. 有序数组的平方icon-default.png?t=N7T8https://leetcode.cn/problems/squares-of-a-sorted-array/

解题思路:

很简单,双指针从大的开始就行,因为是可能有负数,最大的一定是从外侧向中心逼近

209. 长度最小的子数组

209. 长度最小的子数组icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-size-subarray-sum/

这道题看了半天,子数组的概念都没看好,导致混淆了 以为和子序列,子串等概念类似了,纠结于为什么不先排序,想了半天,

做题之前首先要搞清楚什么是子序列,什么是子串;

子序列是指一个字串中非连续的字串,例如:字串A:123456789 它有一个子序列a:13579(非连续) 它有一个子串b:12345(连续)。

1 子序列 是不要求连续的

2 子数组和子串一样,是需要连续的

但是无论是子序列和子数组,他们都可以看作是原数组的一部分,而且不会改变原来数组中元素的相对元素。(和一些题目求是否存在数组元素或者数组元素排列区别)

例题:01串找最长的01出现次数相等的子串,通过把‘0’当成-1,‘1’当成1,可以转化为最长的sum为0的子数组问题

总结:

解题思路:

子数组要求的就是连续的一段,并且要求也比较宽泛,需要>=target,

双指针滑动窗口,

一个左指针,一个右指针,先动一个指针,也就是 右指针向右膨胀,直到找到右指针合适的位置(sum>= target),

此时开始滑动左指针,不断逼近右指针试图找到最小段,(res=Math.min(res,right-left+1); left++)

最后边缘情况,怎么滑动都无法达到结果,res==Integer.MAX_VALUE ? 0 : res ;

59. 螺旋矩阵 II

59. 螺旋矩阵 IIicon-default.png?t=N7T8https://leetcode.cn/problems/spiral-matrix-ii/纯模拟,K神的解析通俗易懂,非常不错

class Solution {
    public int[][] generateMatrix(int n) {
        int tar=n*n;
        int i=0;
        int num=1;
        int t=0;
        int b=n-1;
        int l=0;
        int r=n-1;
        int[][] res=new int[n][n];


        while(num<=tar){
            //l -> r
            for(i=l;i<=r;i++){
                res[t][i]=num++;
            }
            t++;

            //t -> b
            for(i=t;i<=b;i++){
                res[i][r]=num++;
            }
            r--;

            //r -> l
            for(i=r;i>=l;i--){
                res[b][i]=num++;
            }
            b--;

            //b -> t
            for(i=b;i>=t;i--){
                res[i][l]=num++;
            }
            l++;

        }

        return res;

    }
}

K神解析:

K神题解

总结:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值