代码随想录算法训练营 DAY2---备战秋招

主题:数组基础部分

数组基础复盘

数组基本操作机器使用:完整的java数组操作应用知识汇总_w3cschool

刷题:

977.有序数组的平方

图文讲解

视频讲解

双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!代码随想录刷题网站:programmercarl.com, 视频播放量 98477、弹幕量 592、点赞数 2405、投硬币枚数 1980、收藏人数 705、转发人数 124, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:LeetCode刷题分享 | 零基础刷算法题,栈的最后表演! | LeetCode:150. 逆波兰表达式求值,贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间,单调栈,成环了可怎么办?LeetCode:503.下一个更大元素II,贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏II,二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差,动态规划再显神通,LeetCode:516.最长回文子序列,贪心算法,你想先喂哪个小孩?| LeetCode:455.分发饼干,动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分,字符串操作进阶! | LeetCode:541. 反转字符串IIicon-default.png?t=N7T8https://www.bilibili.com/video/BV1QB4y1D7ep

题目及个人题解

977.有序数组的平方
//方法一:暴力破解   
 public int[] sortedSquares(int[] nums) {

        //思路 先将nums的数据的绝对值平方 放入一个数组 最后在经过排序即可

        int[] res=new int [nums.length];

        for(int i=0;i<nums.length;i++){

            res[i]=Math.abs(nums[i])*Math.abs(nums[i]);
        }


        Arrays.sort(res);

        return res;
    }
//暴力破解的时间复杂度为nlogn;

//方法二:双指针 时间复杂度为n
//思路是 左右两个指针 l r 如果左边平方大于右边,左边值存入对应的数组中的末尾j,反之右边平方数存入所剩末尾。

 public int[] sortedSquares(int[] nums) {
        int l = 0;
        int r = nums.length - 1;
        int[] res = new int[nums.length];
        int j = nums.length - 1;
        while(l <= r){
            if(nums[l] * nums[l] > nums[r] * nums[r]){
                res[j--] = nums[l] * nums[l++];
            }else{
                res[j--] = nums[r] * nums[r--];
            }
        }
        return res;
    }

个人总结

暴力解法:所有数字平方后排序

双指针:有序数组,比较每个数平方之间的大小,根据大小放入对应的位置

要学会熟练使用双指针,熟悉其使用场景(比如有序情况下)。

209.长度最小的子数组

图文讲解

视频讲解

拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili《代码随想录》视频讲解开讲啦!快来打卡!, 视频播放量 133636、弹幕量 779、点赞数 3628、投硬币枚数 2886、收藏人数 1030、转发人数 192, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:tcp滑动窗口的完美解释,五分钟看懂【滑动窗口协议】,3.17.滑动窗口基本原理,滑动窗口【基础算法精讲 03】,Leetcode-Python-滑动窗口(Sliding Window)合集,二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差,字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词,贪心算法,你想先喂哪个小孩?| LeetCode:455.分发饼干,tcpip协议第15讲:tcp滑动窗口、拥塞窗口以及拥塞控制原理介绍,[manim动画] 滑动窗口算法介绍和实例icon-default.png?t=N7T8https://www.bilibili.com/video/BV1tZ4y1q7XE

题目及个人题解

209.长度最小的子数组
//方法一:滑动窗口
public int minSubArrayLen(int target, int[] nums) {

        // 思路 是用双指针来判断连续数据是否等于target(滑动窗口)
        // 用sum统计连续数据间的和  result表示其长度

        int left = 0;
        int sum = 0;
        int result = Integer.MAX_VALUE;
        for (int right = 0; right < nums.length; right++) {
            sum += nums[right];
            while (sum >= target) {
                result = Math.min(result, right - left + 1);
                sum -= nums[left++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }

//方法二:暴力破解 采用两个for循环,i j 每一次循环启示位置为i j为结束位置
//偷懒一下,就不写了

个人总结

滑动窗口是基于双指针来实现,left为起点,right为终点,一般是起点不动,终点动,直到满足条件或结束,下一步,起点动,终点先不动,循环以往,实现一个大小可以改变的滑动的窗口。

本体来讲:窗口就是满足其和 ≥ target的长度最小的连续子数组

时间复杂度:O(n):主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)(该部分摘自代码随想录)

59.螺旋矩阵II

图文讲解

视频讲解

一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!代码随想录刷题网站:programmercarl.com, 视频播放量 115162、弹幕量 789、点赞数 2703、投硬币枚数 2044、收藏人数 683、转发人数 181, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法,我更完了,你看完了吗?,【B站推荐】字节大佬一周讲完的LeetCode算法200题。想学好数据结构与算法,看这个视频就够了!,一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵),C语言经典100题(手把手 编程),关于二叉树,你该了解这些!| 二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序,带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!,从此再也不怕动态规划了,动态规划解题方法论大曝光 !| 理论基础 |力扣刷题总结| 动态规划入门,拿下滑动窗口! | LeetCode 209 长度最小的子数组,手把手带你学会操作链表 | LeetCode:203.移除链表元素icon-default.png?t=N7T8https://www.bilibili.com/video/BV1SL4y1N7mV/

题目及个人题解

59.螺旋矩阵 II
//考点模拟过程 
public int[][] generateMatrix(int n) {
    //思路:将每次环绕分为四部分 上:左至右 右:上至下 下:右至左 左:下至上
    
        int[][] res=new int[n][n];
        int h=0;
        int l=0;
        int nums=1;
        while (nums<n*n){

            //上:左至右
            for (int i=l;i<n-l-1;i++){
                res[h][i]=nums++;
            }

            //右:上至下
            for(int j=h;j<n-h-1;j++){
                res[j][n-l-1]=nums++;
            }

            //下:右至左
            for(int k=n-l-1;k>l;k--){
                res[n-h-1][k]=nums++;
            }
            //左:下至上
            for(int z=n-h-1;z>h;z--){
                res[z][l]=nums++;
            }
            h++;
            l++;
        }
        
        //如果为奇数,需要单独给中间模块赋值
        if(n%2!=0) res[n/2][n/2]=n*n;

        return  res;
    }

个人总结

模拟过程就是要找到过程中的核心,也就是不变量,本题的不变量是画圈,从外到内:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

个人鸡汤

有心者无意,无心者有意。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值