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

news2024/11/18 10:44:31

977 有序数组平方

看完题后的思路

双指针

思路

本题如果使用暴力解法,需要按照绝对值将数组排序0(logn),然后进行平方.(或先平方,再排序,这样可以直接调用排序函数) 可以使用双指针法,定义两个指针,左指针是当前绝对值最小的负数,右指针是当前绝对值最小的整数,每一轮将较小数的平方放入结果数组,指针向左或右移动一格.

代码

 //977 有序数组平方
    public int[] sortedSquares(int[] nums) {
        int left=-1,right=nums.length;  // left 当前待处理的负数 right 当前待处理的正数
        int[] result = new int[nums.length];
        // 先提前判断全正 全负的情况
        if (nums[0]>=0){
            right=0;
        }
        if (nums[nums.length-1]<0){
            left=nums.length-1;
        }

        // 找到初始位置
        for (int i = 0; i < nums.length; i++) {
            if (nums[i]>=0){
                left=i-1;
                right=i;
                break;
            }
        }

        //核心逻辑
        int i=0;
        while (left>=0&&right<nums.length){
            if (-1*nums[left]<nums[right]){
                result[i++]=nums[left]*nums[left];
                left--;
            }else {
                result[i++]=nums[right]*nums[right];
                right++;
            }
        }
        // 处理还没有到头的指针
        while (left>=0){
            result[i++]=nums[left]*nums[left];
            left--;
        }
        while (right<nums.length){
            result[i++]=nums[right]*nums[right];
            right++;
        }

        return result;

    }

复杂度

时间复杂度 0(n)
空间复杂度 0(n)

遇到的困难/进一步优化

  1. 代码中三个while有些冗余,能不能用一个while?

可以让left指向数组左端点,right指向数组右端点(从绝对值最大的方向遍历),终止条件为 left<right

978 有序数组平方

看完题后的思路

刚看完题,第一想到的肯定是暴力解法,毕竟双指针并不能一眼看出来,需要手动模拟+思考

思路

这道题首先想到的是暴力解法,两层for循环,时间复杂度为 0(n^2),使用滑动窗口能把时间复杂度降到0(n),这说明暴力解法一定有很多步骤是无用的,找到这些无用的步骤对我们理解双指针和重要
这是暴力的代码

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
            sum = 0;
            for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
                sum += nums[j];
                if (sum >= s) { // 一旦发现子序列和超过了s,更新result
                    subLength = j - i + 1; // 取子序列的长度
                    result = result < subLength ? result : subLength;
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

在这里插入图片描述
  如果我们需要找到大于5的最短子数组,当循环到上面位置的时候,我们这道一个候选结果,此时j再向下循环是无意义的,因为此后的[i,j]和一定大于5,而且长度一定大于3.此时我们可以直接跳出本次循环,进行下一次i=1的循环来省去这些无用功
  当进行下一层循环时,如果j从i开始,也会做一些无用功,如下图:

在这里插入图片描述

当将上面两种无用功避免之后,暴力算法就变成了滑动窗口算法.

代码 (滑动窗口模板)

      //209 长度最小的子数组
    public int minSubArrayLen(int target, int[] nums) {
        int left=0,right=0; // 窗口左右边界 []
        int sum=0;
        int minLength=nums.length+1;
        while (right<nums.length){
            // 初始加入 和 某次循环加入
            sum+=nums[right];
            // 判断
            while (sum>=target){
                minLength=Math.min(minLength,right-left+1);
                sum-=nums[left++];
            }
            // 此时 sum一定小于target
            right++;
        }
        return minLength==nums.length+1 ? 0 : minLength;
    }

复杂度

时间复杂度 0(n)
空间 复杂度0(1)

困难/进一步优化/收获

什么类型的题能使用滑动窗口?

窗口内的特征值(例如本题的和)是递增的,递增的意思是窗口收缩(左边界向前),特征值减小,窗口扩张,特征值变大.

59. 螺旋矩阵 II

看完题后的思路

二刷,温故知新

思路

在这里插入图片描述

生成螺旋矩阵的过程可以看成一圈一圈生成的过程

代码

    // 59. 螺旋矩阵  II
    public int[][] generateMatrix(int n) {
       int[][] res= new int[n][n];
        int rount=0; // 轮数/圈数
        int value=1; // 要赋予的值
        while (rount<(n+1)/2){
            int start=rount,end=n-rount-1; // 每轮开始位置 结束位置

            // 上横
            int mov=start; // 移动指针
            while (mov<=end){
                res[start][mov++]=value++;
            }
            //右竖
            mov=start+1;
            while (mov<=end){
                res[mov++][end]=value++;
            }

            //下横
            mov=end-1;
            while (mov>=start){
                res[end][mov--]=value++;
            }

            //左竖
            mov=end-1;
            while (mov>start   ){
                res[mov--][start]=value++;
            }
            rount++;
        }
        return res;
    }

复杂度

时间复杂度 0(n^2)
空间 复杂度0(1)

困难/进一步优化/收获

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

03、openscenegraph(简称osg)源代码编译

通过上一节&#xff0c;我们准备下载好了osg源代码和依赖库&#xff0c;并安装了CMake、VS2013开发环境&#xff0c;接下来就可以进入编译工作了。 首先&#xff0c;将下载的openscenegraph源代码和依赖库3rdParty_VS2012.3_v110_x86_x64_V8b_full解压到同一个目录下&#xff…

构建系列之新一代利器Esbuild(下)

前言 本篇文章接上文&#xff0c;通过尝试使用esbuild的能力和业界的落地方案作为切入点继续深入esbuild的原理。 尝试Esbuild ESBuild在API层面上非常简洁, 主要的API只有两个: Transform和Build, 这两个API可以通过CLI, JavaScript, Go的方式调用 Transform主要用于对源代…

致而立之年的自己

&#xff08;点击即可收听&#xff09;时间是连续性的,人越长大,越能体会到,所谓的跨年与过年,其实是没有多大意义的但只要是人,就需要制造一些仪式感,弄出一些特殊的节日,用于安慰自己,对于逝去的曾今做一个告别,制造些记忆点然而,记忆这东西,是很容易健忘的,就像昨天,前天,吃…

泰克新2系示波器在微电网测试上的应用

直流微电网是由直流构成的微电网&#xff0c;是未来智能配用电系统的重要组成部分&#xff0c;对推进节能减排和实现能源可持续发展具有重要意义。相比交流微电网&#xff0c;直流微电网可更高效可靠地接纳风、直流逆变等分布式可再生能源发电系统、储能单元、电动汽车及其他直…

【C语言进阶】一万字教你实现简易通讯录管理

目录一. 通讯录要实现的功能1.项目文件分配2.通讯录基本功能二.test.c的实现1.逻辑代码的实现2.通讯录联系人信息的创建三.contacts.c的实现1.初始化通讯录2.添加联系人信息3.显示通讯录信息3.删除指定联系人信息4.查找指定联系人5.修改指定联系人信息6.以名字年龄排序通讯录7.…

进程收尾,初识线程

PCB中的信息:常见属性(有关于进程调度) 1)PID:(进程id)是进程中的身份标识&#xff0c;一个机器同一时刻&#xff0c;不可能有两个进程的PID相同&#xff0c;同一个系统的身份标识&#xff0c;进程的身份证号 2)一组内存指针&#xff1a;指名了该进程持有的一些重要数据和要执行…

一文讲解Linux虚拟化KVM-Qemu分析之virtio初探

说明&#xff1a; KVM版本&#xff1a;5.9.1QEMU版本&#xff1a;5.0.0工具&#xff1a;Source Insight 3.5&#xff0c; Visio 概述 从本文开始将研究一下virtio&#xff1b;本文会从一个网卡虚拟化的例子来引入virtio&#xff0c;并从大体架构上进行介绍&#xff0c;有个宏…

惊奇地发现:「精通或熟练使用 Navicat 」成为了业内企业招聘的任职要求之一

2023 年疫情逐渐消散&#xff0c;招聘市场也火热了起来。我们在招聘平台惊奇地发现&#xff1a;许多岗位招聘启事&#xff08;如&#xff1a;前端开发工程师、业务系统开发工程师和高级数据分析师等&#xff09;中提到&#xff0c;具备熟练使用 Navicat 软件成为任职要求之一。…

正版授权|bigmp4 Ai人工智能视频无损放大

bigmp4&#xff0c;使用先进人工智能 AI 模型&#xff0c;能将视频无损高清放大、增强画质、智能补帧使画面丝滑流畅栩栩如生同时支持黑白视频上色和慢动作。 人工智能视频无损放大 使用今年先进人工智能 AI 模型&#xff0c;能将视频无损高清放大、增强画质、智能补帧使画面丝…

Android Volley 基本使用

Android Volley 基本使用 本篇主要介绍 Google 给Android 平台提供的 Volley 一个 Http请求库 , 齐射! 1.概述 Volley是Google 提供的一个小巧的异步请求库,扩展很强支持okhttp,(默认是 Android2.3 及以上基于 HttpURLConnection&#xff0c;2.3 以下基于 HttpClient 实现), V…

<<数据结构>>向上调整建堆和向下调整建堆的分析(特殊情况,时间复杂度分析,两种建堆方法对比,动图)

今天&#xff0c;我来讲讲建堆算法中使用向上调整和向下调整。 目录建堆的应用向上调整建堆向下调整建堆向下调整建堆和向上调整建堆的选择建堆的应用 在数据结构模拟堆中&#xff0c;我们可能会通过输入数组的元素来进行建堆或者在堆排序中&#xff0c;我们也需要建堆&#x…

Kubernetes之网络排查详细文

文章目录前言一、Pod 网络异常1.1 网络异常大概分为如下几类&#xff1a;1.2 那么整个 Pod 网络异常分类可以如下图所示&#xff1a;二、常用网络排查工具2.1 tcpdump2.1.1 抓取示例2.1.2 选项分组2.1.3 过滤 TCP 标记位2.1.4 查找 http 包2.1.5 查找 DNS 流量2.1.6 查找对应流…

财务数字化在企业数字化转型中起到什么作用?

财务数字化在企业数字化转型中起到什么作用&#xff1f;许多企业在推动各大业务部门进行数字化转型时&#xff0c;往往会忽略财务部门。然而&#xff0c;作为掌握公司核心资源与数据和推动企业数字化建设的部门&#xff0c;财务也应成为企业数字化转型的重要突破口。 这篇就用…

Unity 之 Addressable可寻址系统 -- 可寻址系统使用介绍 -- 入门(三)

可寻址系统设置面板使用介绍介绍 -- 入门&#xff08;三&#xff09;一&#xff0c;可寻址系统目录介绍二&#xff0c;可寻址系统面板介绍2.1 Groups - 资源组2.2 Settings - 设置2.3 Profiles - 配置文件2.4 Event Viewer - 事件查看器2.5 Analyze - 分析工具2.6 Hosting - 托…

sklearn GridSearchCV网格搜索和SVM的两个参数 C 和 gamma

GridSearchCV&#xff0c;它存在的意义就是自动调参&#xff0c;只要把参数输进去&#xff0c;就能给出最优化的结果和参数。GridSearchCV用于系统地遍历多种参数组合&#xff0c;通过交叉验证确定最佳效果参数。 引用自&#xff1a;公众号&#xff1a; 写bug的程旭源 个人博客…

学生信息管理系统【JDBC+JS+MYSQL+HTML+JSP+Servlet】(一)

第一次发综合项目&#xff0c;无论是前端还是后端&#xff0c;都应用到了&#xff0c;项目写的很完整&#xff0c;我将分为四篇文章把项目代码写完&#xff0c;多多支持 一&#xff1a;项目背景 学生成绩管理系统是基于互联网的信息管理平台&#xff0c;主要提供成绩录入和查…

黄金的几种征兆

有别于股票、基金等的投资品种&#xff0c;由于现货黄金采用保证金的交易制度&#xff0c;因而使投资者有爆仓的可能。具体而言&#xff0c;爆仓是指在某些特殊条件下&#xff0c;投资者保证金账户中的客户权益变为负值的情形。在黄金交易的实战中&#xff0c;客户爆仓大多与资…

一文搞懂Spring,堪称Spring源码终结者

Spring的影响力想必无需与大家多说&#xff0c;如果你用spring&#xff0c;那么读读源码有助于对你最重要的工具的理解&#xff0c;好的框架源码也可以帮助我们理解什么是好代码。 刚参加工作那会&#xff0c;没想过去读源码&#xff0c;更没想过去改框架的源码&#xff1b;甚…

反序列化渗透与攻防(一)之PHP反序列化漏洞

前言 序列化和反序列化几乎是工程师们每天都要面对的事情&#xff0c;但是要精确掌握这两个概念并不容易&#xff1a;一方面&#xff0c;它们往往作为框架的一部分出现而湮没在框架之中&#xff1b;另一方面&#xff0c;它们会以其他更容易理解的概念出现&#xff0c;例如加密、…

干货 | 涉疫数据的安全应用方案

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;涉疫数据分类及问题剖析一、涉疫数据分类我们以新冠肺炎疫情为例&#xff0c;构建数据图谱&#xff0c;将涉疫数据分为三个大类&#xff0c;八个小类&#xff0c;共分为50项…