算法打卡day2|数组篇|Leetcode 977.有序数组的平方、 209.长度最小的子数组、59.螺旋矩阵II

 算法题

Leetcode 977.有序数组的平方 

题目链接:  977.有序数组的平方

大佬视频讲解:977.有序数组的平方

个人思路

第一时间就只想到暴力解法,双重循环一个循环比较一个循环赋值;但这样可能会超时,所以还能用双指针,因为这个数组是递增数组,也就是说平方后最大的值只能在两边,那么前后各一个指针,比较其值,再根据大小放进新的数组中就能解决,这也是空间换时间的方法;

解法
暴力解法

循环赋值然后排序;

class Solution {
    public int[] sortedSquares(int[] nums) {
        for(int i=0;i<nums.length;i++){//暴力循环求值
            nums[i]*=nums[i];
        }
        Arrays.sort(nums);//排序
        return nums;
    }
}

时间复杂度:O(nlog n);(一个for循环为n,再加上排序的nlogn,和为n+nlogn ,取最大的时间复杂度即为nlogn)

空间复杂度:O(1);(没有使用多余空间)

双指针

left指向起始位置,right指向终止位置。定义一个新数组newNums,和A数组一样的大小,根据平方的大小来从数组newNums后往前赋值。

class Solution {
    public int[] sortedSquares(int[] nums) {
        int len=nums.length;//数组的长度
        int left=0; int right=len-1;//双指针
        int[] newNums=new int[len];//新数组
        int index=len-1;//新数组赋值的指针

        while(left<=right){
            if (nums[left] * nums[left] > nums[right] * nums[right]) {
                newNums[index]=nums[left]*nums[left];//新数组赋值
                index--;//新数组指针往前移
                ++left;//起始指针往前移
            }else{
                newNums[index]=nums[right]*nums[right];//新数组赋值
                index--;
                --right;//结尾指针往后移
            }
        }
        return newNums;
    }
}

时间复杂度:O(n);(最糟糕的可能就是把数组全遍历一遍,因此为On)

空间复杂度:O(n);(使用多一个数组存值)

Leetcode 209.长度最小的子数组

题目链接:209.长度最小的子数组

大佬视频讲解:209.长度最小的子数组视频讲解

个人思路

一开始又想到暴力解法,但这样明显会超时;然后...就没思路了。(之前刷过好几次滑动窗口还是想不起来,菜得多练呀/无奈)

解法
滑动窗口

滑动窗口就是不断的调节子序列的起始位置和终止位置

其中主要确定如下三点:

  1. 窗口的定义;窗口就是 满足其和 ≥ target  的长度最小的 连续 子数组。
  2. 窗口的起始位置如何移动:如果当前窗口的值大于target 了,窗口就要向前移动了(也就是该缩小了)。
  3. 窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

如果还是比较抽象建议看看视频209.长度最小的子数组视频讲解

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //暴力解法,从头开始遍历,计算达到目标值的张最小连续数组即可;这样会超时
        int start=0;//滑动窗口的起始位置
        int sum=0;//滑动窗口的和
        int answer=Integer.MAX_VALUE;//结果数组长度
        for(int end=0;end<nums.length;end++){//滑动窗口的结束位置
            sum+=nums[end];
            while(sum>=target){
                answer=Math.min(answer,end-start+1);//用当前滑动窗口的长度与之前长度对比
                sum-=nums[start++];//不断变更start(子序列的起始位置)
            }
        }
        return answer==Integer.MAX_VALUE ? 0:answer;// 如果说明没有符合条件的子序列,即answer没有被赋值的话,就返回0,
    }
}

时间复杂度:O(n);(一个 for循环加上一个while没有嵌套,所以是n+n,2n)

空间复杂度:O(1);(没有使用多余空间)

Leetcode  59.螺旋矩阵II

题目链接:59.螺旋矩阵II

大佬视频讲解:59.螺旋矩阵II视频讲解

个人思路

这道题之前做过,没怎么搞懂,只记得是找规律,那先画图看看;画一个n为4和5的数组,螺旋循环后发现规律如下:有四个方向赋值;这四个方向的赋值数量刚刚开始都是n-1;如果n为奇数,则会剩下中间的值没有赋值;循环次数正好是n/2;根据这些规律怎么写代码也是个难题,还得多练

解法
找规律

顺时针画矩阵的过程:

  1. 上行;从左到右填充数据
  2. 右列;从上到下填充数据
  3. 下行;从右到左填充数据
  4. 左列:从下到上填充数据

由外向内一圈一圈这么画下去。可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,得按照固定规则来遍历,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。

下面的是按照左闭右开规则

class Solution {
    public int[][] generateMatrix(int n) {
        int loop = 0;  // 控制循环次数
        int start = 0;  // 每次循环的开始点(start, start)
        int count = 1;  // 定义填充数字
        int[][] res = new int[n][n];//结果数组
        int i, j;

        while (loop++ < n / 2) { // 先判断边界后,再自增1,以此循环(n-loop)
            for (j = start; j < n - loop; j++) {// 上侧从左到右填充数据
                res[start][j] = count++;}
  
            for (i = start; i < n - loop; i++) {// 右侧从上到下填充数据
                res[i][j] = count++;}
           
            for (; j >= loop; j--) {// 下侧从右到左填充数据
                res[i][j] = count++;}

            for (; i >= loop; i--) {// 左侧从下到上填充数据
                res[i][j] = count++;}
            start++;
        }

        if (n % 2 == 1) {//判断n为奇数还是偶数,若为奇数,循环填充后还剩一个中间数没填;
            res[start][start] = count;
        }
        return res;
    }
}

时间复杂度:O(n^2);(模拟遍历二维矩阵的时间)

空间复杂度:O(1);(没有使用多余空间)

以上是个人的思考反思与总结,若只想根据系列题刷,参考卡哥的网址代码随想录算法官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/411731.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

halcon中的2D测量-椭圆

一、定义 二维测量指的是测量二维几何图形的参数&#xff0c;例如圆、椭圆、圆弧、矩形的相关参数。这里的参数对圆来说可以是半径&#xff1b;椭圆可以是长半轴、短半轴&#xff1b;矩形则包括宽和高。 二、基本步骤 1.创建测量模型 使用算子 create_metrology_model 2.设…

积分商城管理系统的设计与实现

积分商城管理系统的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

设计模式(二)单例模式的七种写法

相关文章设计模式系列 面试的时候&#xff0c;问到许多年轻的Android开发他所会的设计模式是什么&#xff0c;基本上都会提到单例模式&#xff0c;但是对单例模式也是一知半解&#xff0c;在Android开发中我们经常会运用单例模式&#xff0c;所以我们还是要更了解单例模式才对…

【任何电机可使用的七段式s曲线-----包括matlab代码和simulink仿真】

永磁同步电机七段式s曲线 一、前言二、理论分析三、7段式s曲线加减速关系图四、matlab代码代码结果 五、simulink七段式s曲线整体框图simulink结果s-function内嵌代码 六、使用双闭环FOC控制-----simulink仿真示意 一、前言 S形&#xff1a;加加速(T1)→>匀加速(T2)→减加速…

【JVM】StringTable 字符串常量池

参考&#xff1a;javaGuide 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串&#xff08;String 类&#xff09;专门开辟的一块区域&#xff0c;主要目的是为了避免字符串的重复创建 String的不可变性 1.通过字面量的方式&#xff08;区别于new&#xff09;给一个…

Avalonia学习(二十六)-桌面系统界面Ribbon

这个界面是开源项目中拔下来的&#xff0c;我没有全部改完&#xff0c;只能按照我得界面测试。我还有一个bug没有找到&#xff0c;但是解决了一下。这里没有任何和大家说的&#xff0c;给大家看一下界面效果。 另外地图研究了缩放和显示鼠标位置经纬度

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…

Java核心知识点常考面试题(持续更新中)

Java核心知识点常考面试题&#xff08;持续更新中&#xff09; 线程与线程池线程线程池 Java锁机制java线程模型java锁分类轻量级锁重量级锁ReentrantLock 底层原理与源码深度解析ReentrantReadWriteLock 深入理解读写锁CountDownLatchsemaphore 实现公平锁与非公平锁线程死锁与…

Android 9.0 禁用插入耳机时弹出的保护听力对话框

1.前言 在9.0的系统rom定制化开发中,在某些产品中会对耳机音量调节过高限制,在调高到最大音量的70%的时候,会弹出音量过高弹出警告,所以产品 开发的需要要求去掉这个音量弹窗警告功能,接下来就来具体实现这个功能 2.禁用插入耳机时弹出的保护听力对话框的核心类 framework…

第六十八天 APP攻防-XposedFridaHook证书校验反代理代理转发

第68天 APP攻防-Xposed&Frida&Hook&证书校验&反代理&代理转发 知识点&#xff1a; 1、APP防代理绕过-应用&转发 2、APP证书校验类型-单向&双向 3、APP证书校验绕过-Frida&XP框架等 章节点&#xff1a; 1、信息收集-应用&资产提取&权…

蓝桥杯-标题统计

知识点: 关键是考察getline的作用 #include <iostream> using namespace std; int main() { string a; int t0; getline(cin,a);//每次读取一整行并把Enter键生成的换行符抛弃 for(int i0;i<a.length();i){ if(a[i]! )t; } cout<<t; return …

【LTSPICE】宏模型中的语法分析(持续更新)

本篇文章用来总结模型文件、仿真文件中的语法&#xff0c;写给自己看的&#xff0c;格式和内容上比较随意 上图是在安森美官网上下载的一款二极管的spice模型文件。 * 字符串&#xff1a;注释&#xff0c;能看到这篇文章的应该都懂啥叫注释.model&#xff1a;.一个词是命令…

如何修改图片尺寸大小不变形?简单的图片改大小的方法

在平时工作或者学习时&#xff0c;有时候需要将图片的大小进行修改&#xff0c;以便于存储、分享或打印&#xff0c;很多人都习惯性的去下载一些图片处理软件&#xff0c;比较麻烦&#xff0c;这里推荐大家使用图片在线处理工具&#xff0c;打开浏览器直接将图片尺寸修改&#…

【Flink】Flink 中的时间和窗口之窗口(Window)

1. 窗口的概念 Flink是一种流式计算引擎&#xff0c;主要是来处理无界数据流&#xff0c;数据流的数据是一直都有的&#xff0c;等待流结束输入数据获取所有的流数据在做聚合计算是不可能的。为了更方便高效的处理无界流&#xff0c;一种方式就是把无限的流数据切割成有限的数…

【析】装卸一体化车辆路径问题的自适应并行遗传算法

0 引言 国内外有关 &#xff36;&#xff32;&#xff30;&#xff33;&#xff30;&#xff24;的文献较多&#xff0c;求解目标多以最小化车辆行驶距离为主&#xff0c;但现实中可能存在由租赁费用产生的单次派出成本&#xff0c;需要综合考 虑单次派车成本和配送路径成本。…

消息中间件之RocketMQ源码分析(十八)

Broker CommitLog索引机制中的构建过程 1.创建ConsumeQueue和IndexFile。 ConsumeQueue和IndexFile两个索引都是由ReputMessageService类创建的 RequestMessageService类图 ReputMessageService服务启动后的执行过程。 doReput()方法用于创建索引的入口&#xff0c;通常通过…

Redis 管道详解

Redis 管道 关键词&#xff1a;Pipeline Pipeline 简介 Redis 是一种基于 C/S 模型以及请求/响应协议的 TCP 服务。通常情况下&#xff0c;一个 Redis 命令的请求、响应遵循以下步骤&#xff1a; 客户端向服务端发送一个查询请求&#xff0c;并监听 Socket 返回&#xff08…

3 easy 26. 删除有序数组中的重复项

双指针&#xff1a; //给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 //一致 。然后返回 nums 中唯一元素的个数。 // // 考虑 nums 的唯…

PreMaint CMS系统:数字化驱动起重机远程管理的智能未来

在港口起重机领域&#xff0c;数字化解决方案正成为提高效率、降低停机时间的关键。PreMaint CMS作为起重机核心可视化系统&#xff0c;融合了操作人员、维护团队和管理者的需求&#xff0c;通过智能化的方式&#xff0c;将复杂的数据转化为简洁的信息&#xff0c;实现对起重机…

Node.js中的错误处理和日志记录

在Node.js应用程序中&#xff0c;错误处理和日志记录是非常重要的方面。正确的错误处理和日志记录可以帮助我们更好地跟踪问题、排查 bug&#xff0c;并提供更好的用户体验。在本篇博客中&#xff0c;我将为大家介绍在Node.js中如何进行错误处理和日志记录&#xff0c;以及一些…