算法训练 Day 2 | 数组:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

这篇具有很好参考价值的文章主要介绍了算法训练 Day 2 | 数组:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 有序数组的平方

977. 有序数组的平方

  • 第一想法:暴力破解

  • 看完题解想法:朝着双指针方向想

  • 遇到困难:

    • 用双指针的话,一开始想到两边指针往中间靠,逐个将最大值赋给结果数组。和题解不同的是,循环条件我写了 while (left != right) {...},相比于题解的 while (left <= right) {...},我需要在后面单独为第一个元素赋值(因为没有cover到最后一个元素就跳出循环了)

    • 判断条件中,对于nums[left] == nums[right]这种情况,一开始的想法是两头同时逼近与赋值。但是在最后两个元素相同时,此想法报错(例如:[-1, 0, 0, 2])。因此左右指针相等时,可以将其归到两边指针中的一边执行。

public int[] sortedSquares(int[] nums) {
        int[] res = new int[nums.length];

        for (int i = 0; i < nums.length; i++) {
            nums[i] *= nums[i];
        }

        int left = 0; 
        int right = nums.length - 1;
        int curr = right;

        // 一开始写了while (left != right) {...},就需要最后手动赋值
        while (left <= right) {
            if (nums[left] >= nums[right]) {
                res[curr] = nums[left];
                left++;
            } else if (nums[left] < nums[right]) {
                res[curr] = nums[right];
                right--;
                
            }
            curr--;
        }
        // 最后一个元素时需要手动赋值
        // res[0] = nums[left];
        return res;
    }
  • 时长与收获:

    • 双指针循环条件需要cover到边界

    • 左右两边元素相等时,可以选择一遍执行

    • 时长:30min

2. 长度最小的子数组

209. 长度最小的子数组

  • 第一想法:可以想到双指针

  • 看完题解想法:和题解想法差不多,主要差别在:计算数组元素个数语句count = Math.min()的位置不同。官方题解把该语句在while (sum >= target)循环内,意思是计算每一步sum >= target的最小值;而我放在了循环外,再+1

  • 遇到困难:

    1. 每次循环内代码的执行顺序不是很明确(例如什么时候指针移动,什么时候累加)。

    2. 最后忘记将Integer.MAX_VALUE转成了0

  • 时长与总结:

    1. 右指针的移动伴随着总数的累加,因此累加操作要在每个循环的开头

    2. 时长:40min文章来源地址https://www.toymoban.com/news/detail-411163.html

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

        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (sum < target) continue;

            // 1.1 取到sum < target长度最大时跳出循环
            while (sum >= target) {
                sum -= nums[left];
                left++;
            }
            // 1.2 这里需要额外+1,意思是把 sum < target最大长度 变成 sum >= target最小长度
            count = Math.min(count, i - left + 1 + 1);
            
        }
        // 2.1 不存在符合条件的数组时,返回0
        return count == Integer.MAX_VALUE? 0 : count;
    }

3. 螺旋矩阵II

到了这里,关于算法训练 Day 2 | 数组:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • LeetCode-Day2-977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,

    LeetCode-Day2-977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,

    双指针法,原来数组是有序的,说明平房之后最左和最右两边的平方和是最大的,比较最大的插入新的vector数组,然后移动指针选下一个元素进行比较。 接下来就开始介绍数组操作中另一个重要的方法: 滑动窗口 。 所谓滑动窗口, 就是不断的调节子序列的起始位置和终止

    2024年02月16日
    浏览(10)
  • day2-数组part02| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II

    数组平方后的最大值只可能在数组两端,不可能在中间 设置双指针,比较两个指针所指值的大小,记录较大值,接着向中间移动这个指针 结束条件:左右指针相背 暴力一直不过,明天再补一下 不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。 思路 子数

    2024年02月02日
    浏览(9)
  • 【LeetCode题目详解】 977.有序数组的平方 209.长度最小的子数组59.螺旋矩阵II day2

    【LeetCode题目详解】 977.有序数组的平方 209.长度最小的子数组59.螺旋矩阵II day2

    看完这个题目第一想法就是直接暴力解决,直接将全部平方然后进行排序。比如快排。 代码如下: 时间复杂度是 O(nlogn)或者说【O(n + nlogn)】,括号里面这个是为了比较接下来的方法。 然后看了代码随想录的视频学习了用双指针来写这道题的方法(说实话不看视频真没想到可

    2024年02月13日
    浏览(10)
  • LeetCode977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    LeetCode977.有序数组的平方 思路:         双指针应用         因为数组是有序的,数组中可能存在负数,所以其平方的最大值只可能是数组的头或尾,因此可以定义两个指针,i指向头,j指向尾。同时定义一个新数组result,让k指向新数组的最后一个元素,当nums[i] * nums[i]

    2023年04月21日
    浏览(8)
  • Leetcode 977-有序数组的平方 | LeetCode209-长度最小的子数组 | Leetcode59-螺旋矩阵

    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 思考: 这个数组为有序数组,那么即使前面有负的,数组平方的最大值只能是在数组的倆端,不是在左边就是右边,不可能是在中间 由此想到双指针做法,left从

    2024年02月16日
    浏览(14)
  • 代码随想录第二天|977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

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

    第二天开始了, 一开始自己写,就只想到了先一个个平方,再排序(甚至打算手写排序循环,后来才发现c++有自带的排序函数sort(a.begin(),a.end()),c++真好,加油努力学习c++。 第二种方法然后看提示用双指针也完全没想出来,只能看文章了,泪 写完发现代码乱七八糟,要改。

    2024年02月13日
    浏览(12)
  • [自我记录]随想录刷题第二天 | 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

     代码随想录打卡第二天, 新手自我记录一下刷题历程, 仅为自我打卡使用. 今天刷了三道主题, 第一道双指针和第三道模拟做出来了, 第二道写出了暴力解法但是提交leetcode超时了, 测试用例过了18/20, 看了carl哥答案以后自己重新补写了滑动窗口方法. 977. 有序数组的平方 简单题

    2024年02月05日
    浏览(11)
  • 有序数组的平方、长度最小的子数组、螺旋矩阵II(Day2)

    题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 第一反应暴力如上代码 下面写一段用双指针思想的代码 题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/ 本题暴力解法会超时,以下采用滑动窗口的方式(将暴力的两个for循环变成一个) 题目链接:https://leetcode.cn/

    2023年04月26日
    浏览(8)
  • 代码随想录day2|有序数组的平方、长度最小的子数组、螺旋矩阵

    代码随想录day2|有序数组的平方、长度最小的子数组、螺旋矩阵

    前言:今天去校医院拔了两颗牙,太痛了,今天写的博客就比较水。 所谓滑动窗口,就是不断的调节 子序列的起始位置和终止位置 ,从而得出我们要想的结果。

    2024年02月01日
    浏览(11)
  • 算法-有序数组的平方,长度最小的子数组,螺旋矩阵II

    算法-有序数组的平方,长度最小的子数组,螺旋矩阵II

    伪装成一个老手! 题目 给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 示例 : 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100] 来源:力扣977 思路 遍

    2024年02月11日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包