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

977. 这题很简单上来直接每个元素原地算平方然后sort简单又粗暴,很显然效率不是很高。然后使用双指针思想,原数组是有序的但是因为有负数的存在,平方过后可能会变大,因此用双向指针(最大值肯定是两端的其中一个)。两端的值平方过后进行比大小,创建一个新的result数组,然后将较大的那个数字放到新数组的末端(从尾到头开始放),然后移动指针。这题主要考的就是一个思路问题,思路有了也就没什么问题了(空间换时间)。

 

209 数组经典之滑动窗口!!!这题之前做过已经忘记思路了,看了题解才想起来滑动窗口这个操作。其精髓就在于一个for循环里面镶嵌一个while循环,但凡记住这个模版或者说套路,后面的类似题目都应该算是比较好解的。当前n个和大于等于target的时候移动left指针(这里特别要注意移动left指针前一定要确保当前的sum值要减去nums[left]的值),然后for循环继续移动right指针继续求sum。注意:最后return的时候还是要和Integer.MAX_VALUE进行比较,如果ans的值没变还是Integer.MAX_VALUE说明while循环的条件一直没被满足,也就是sum>=target的这个条件一直没达到,这个情况下就要return 0,反之则return (right - left) + 1 ,下标运算最后结果要+1才行。

public int minSubArrayLen(int target, int[] nums) {
        int left =0;
        int ans=Integer.MAX_VALUE;
        int sum = 0;

        for(int right=0; right<nums.length; right++){
            sum += nums[right];
            while(sum >= target){
                ans = ans < (right - left)+1 ? ans : (right - left)+1;
                sum -= nums[left];
                left++;
            }
        }
        // 这里要注意还是和Integer.MAX_VALUE比较,看看有没有发生变化
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }

 

59.  这题属于模拟题目,不算是算法题目,但是朕实在是学不明白,尔等且先退下,等我下次再来看。(这里贴一段代码先,不是carl的,leetcode大神的感觉他这个更好理解点似乎)

class Solution {
    public int[][] generateMatrix(int n) {
        int l = 0, r = n - 1, t = 0, b = n - 1;
        int[][] mat = new int[n][n];
        int num = 1, tar = n * n;
        while(num <= tar){
            for(int i = l; i <= r; i++) mat[t][i] = num++; // left to right.
            t++;
            for(int i = t; i <= b; i++) mat[i][r] = num++; // top to bottom.
            r--;
            for(int i = r; i >= l; i--) mat[b][i] = num++; // right to left.
            b--;
            for(int i = b; i >= t; i--) mat[i][l] = num++; // bottom to top.
            l++;
        }
        return mat;
    }
}


/**
作者:Krahets
这段代码是一个Java解决方案,用于生成一个n阶方阵,其中方阵元素按照从1到n*n的顺序逆时针螺旋排列。

解决方案首先初始化了左边界l、右边界r、顶部边界t、底部边界b,并创建了一个n*n大小的二维数组mat用于存储结果。

(当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:
1.执行 num += 1:得到下一个需要填入的数字;
2.更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1)

然后在一个while循环中,通过四个for循环不断填充矩阵mat。具体来说:
- 第一个for循环从左到右填充上边界,填充完成后上边界向下移动一行( t += 1)。
- 第二个for循环从上到下填充右边界,填充完成后右边界向左移动一列。
- 第三个for循环从右到左填充下边界,填充完成后下边界向上移动一行。
- 第四个for循环从下到上填充左边界,填充完成后左边界向右移动一列。

循环直到填充完所有元素为止,然后返回生成的矩阵mat。

使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。

整体来说,这段代码实现了一个逆时针螺旋填充矩阵的功能,通过不断更新边界和填充矩阵元素来完成任务。


 */

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值