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

977.有序数组的平方

这道题给出的原数组有两个特点:
1、由小到大
2、有负数有正数
因此,这个数组平方后的数应该是从两头向中间的0减小的,但是两头的大小需要我们用两个指针便历之后去判断大小。在遍历的同时left指针向右走,right指针向左走,每次判断left和right指针指向的平方数的大小,哪边大就将这个大的数放到新的数组中,注意:题目要求新数组由小到大排列,所以我们也要由最后往前面放平方数。 每次判断大小,如果是left指针的平方数大,left右移一位;如果是right指针的平方数大,right左移一位,直到right=left,为什么要等于?因为当right=left的时候,它们同时指向的这个平方数还没有被放到新数组里,因此要判断一次大小(当然是一样大的)再将这个数放到新的数组中。
可以举一个很简单的例子: 当原数组只有两个元素的时候,left=0,right=1,两个指针判断玩大小只会把一个指针指向的平方数放到新数组中,还有一个还没放,因此还需要再移动一下指针,再放一次。

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int[] numsRes = new int[nums.length];
        int i = nums.length - 1;//这个i用来控制放入新数组的位置,无论是左右指针哪一个更新,i都需要--
        while(left <= right){//注意这里的等于也是有含义的,假设整个数组就两个数,那么left = right,也需要进行一次while循环
            if(nums[left]*nums[left] >= nums[right]*nums[right]){
                numsRes[i] = nums[left]*nums[left];
                i--;
                left++;
            }else{
                numsRes[i] = nums[right]*nums[right];
                i--;
                right--;
            }
        }
        return numsRes;
    }
}

59.螺旋矩阵||

在这里插入图片描述

这道题目根据题意,需要创建一个int[n][n]的数组,然后按照题目顺时针的顺序将[1,n**2]的数字放到这个数组中,所以关键在于确定每个数放置的位置的索引值,以控制数是顺时针放置在数组中的。
如图所示,我们放置的整体顺序是一圈一圈的,每个圈四个边,每个边有起始位置用start参数控制,每一圈中每个边遍历的个数不同,因此用offset控制,offset如图所示往里一圈+2,start如图所示往里一圈+1。
一共应该是(int)n/2圈,如果n是奇数的话最中间的是单独的一个元素,需要单独给值,我们最后判断一下n就行了,赋个值。

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];//存储结果数组
        int offset = 1;//控制不同圈每个边遍历的个数
        int start = 0;//控制不同圈每个边起始索引
        int num = 1;//控制要放入的值
        for(int i = 0;i < n/2;i++){//圈数
            for(int k = 0;k < n-offset;k++){//上边
                res[start][k+start] = num;
                //如图上边的x不变为start,y从start往后共遍历n-offset个元素
                num++;
            }
            for(int k = 0;k < n-offset;k++){//右边
                res[start+k][n-1-start] = num;
                //如图右边的y不变为n-1-start,x从start往后共遍历n-offset个
                num++;
            }
            for(int k = 0;k < n-offset;k++){//下边
                res[n-1-start][n-1-start-k] = num;
                //如图下边的x不变为n-1-start,y从n-1-start开始往前共遍历n-offset个,因此为减
                num++;
            }
            for(int k = 0;k < n-offset;k++){//左边
                res[n-1-start-k][start] = num;
                //如图左边的y不变为start,x从n-1-start开始往前遍历共遍历n-offset个,因此为减
                num++;
            }
            start++;//遍历完一圈start加一
            offset+=2;//遍历完一圈offset加2
        }
        if(n%2 == 1) res[n/2][n/2] = n*n;//n偶数的话正好遍历n/2圈,n为奇数的话最中间的这个元素需要单独赋值
        return res;
    }
}

209.长度最小的子数组

暴力解法

当然超出了时间限制,这里讲解一下思路:
定义两个指针left和right,初始化为0。left标定之后,right向后遍历,只要left或者right指针动一次,就计算[left,right]区间里的和sum。
如果sum>=target,left++以减少sum;
如果sum<target,right++以增加sum;
while()循环用right<nums.length条件控制,left永远小于right。
最后如果left0并且rightlength,说明整个数组的和都达不到target,返回0.

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int right = 0;
        int res = nums.length;
        while(right < nums.length){
            int sum = 0;
            for(int i = left;i <= right;i++){
                sum += nums[i];
            }
            if(sum >= target){
                res = Math.min(res,right-left+1);
                left++;
            }else{
                right++;
            }
        }
        if(left == 0 && right == nums.length) return 0;
        return res;
    }
}

209.滑动窗口

这个方法需要两个指针i和j控制滑动窗口的头和尾,尾指针需要遍历整个数组,i指针用来当j指针滑动到符合条件的区间的尾的时候,调整区间的头从而缩小滑动窗口的区间以获得最小的区间。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0;
        int i = 0;
        int res = nums.length;
        int total = 0;
        for(int j = 0;j < nums.length;j++){
            total += nums[j];
            sum+=nums[j];
            while(sum >= target){//当遇到符合条件的区间的时候,需要去持续缩小该区间的范围直到找到最短的符合条件的区间,所以这里用while不用if
                res = Math.min(res,j-i+1);//每次缩小范围之后去获取一下这个最小范围的区间长度
                sum -= nums[i];//sum减去缩小的nums[i]的值
                i++;//头指针右移
            }
        }
        if(total < target) return 0;//在遍历的过程中,也同时获取到了整个数组的和,如果整个数组的和都小于target了,则说明该数组不存在满足条件的子数组,因此返回0.
        return res;
    }
}

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

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

相关文章

Spring使用的设计模式

Spring 框架是一个广泛使用的 Java 框架&#xff0c;它内部使用了多种设计模式来简化开发过程、提高代码的可维护性和扩展性。 以下是一些在 Spring 框架中常见的设计模式&#xff0c;以及用代码示例来解释它们&#xff1a; 一、工厂模式&#xff08;Factory Pattern&#xff…

DIYGW UniApp可视化开发工具:前端开发人员的新宠

在前端开发的领域中&#xff0c;API接口的测试与调试一直是开发人员面临的挑战之一。传统的测试工具虽然能够完成基本的测试任务&#xff0c;但在效率、易用性和直观性方面仍有提升的空间。随着技术的发展&#xff0c;DIYGW UniApp可视化工具应运而生&#xff0c;为开发人员提供…

智慧园区:打造未来城市的新模式

随着城市化进程的加速和科技创新的推动&#xff0c;城市面临着诸多挑战和机遇。如何提升城市的竞争力和可持续性&#xff0c;是一个亟待解决的问题。在这个背景下&#xff0c;智慧园区作为一种新型的城市发展模式&#xff0c;引起了越来越多的关注和探索。 什么是智慧园区&…

gitlab将本地文件项目上传至gitlab服务

打开gitlab网页界面&#xff0c;登陆管理员账号 &#xff08;测试服务器安装的gitlab&#xff0c;浏览器输入ip或配置的gitlab地址&#xff09; 创建新项目 使用gitlab创建项目 创建一个新项目&#xff08;忽略分组&#xff09; &#xff08;忽略分组&#xff09; 在创建工…

CSS文本粒子动画特效之爱心粒子文字特效-Canvas

1. 效果图 2.完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;paddin…

一篇文章带你快速搞定Kafka术语no.2

在Kafka的世界中有很多概念和术语是需要你提前理解并熟练掌握的&#xff0c;这对于后面你深入学习Kafka各种功能和特性将大有裨益。下面我来盘点一下Kafka的各种术语。 在专栏的第一期我说过Kafka属于分布式的消息引擎系统&#xff0c;它的主要功能是提供一套完备的消息发布与…

全球排名第一的免费开源ERP:Odoo与微信集成的应用场景解析

概述 本文介绍了世界排名第一的开源免费企业应用软件Odoo ERP和企业微信、个人微信的各种对接功能。包括微信登录的对接、微信公众号的对接、微信消息的对接、微信支付的对接、微信打卡的对接、微信小程序的对接。 微信登录的对接 Odoo的登录&#xff0c;除了标准的用户名/密码…

律所电子签章有效吗,怎么操作?

电子签章在很多国家和地区是合法有效的&#xff0c;但其有效性、使用条件和操作流程可能依据具体的法律法规而有所不同。在中国&#xff0c;随着《中华人民共和国电子签名法》的实施&#xff0c;电子签章在满足一定条件下是具有法律效力的。电子签章可以提高合同签订的效率&…

QT 自定义协议TCP传输文件

后面附带实例的下载地址 一、将文件看做是由:文件头+文件内容组成,其中文件头包含文件的一些信息:文件名称、文件大小等。 二、文件头单独发送,文件内容切块发送。 三、每次发送信息格式:发送内容大小、发送内容类型(文件头或是文件块内容)、文件块内容。 四、效果展…

【香橙派 AIpro】OrangePi AIpro :教育、机器人、无人机领域的超级AI大脑,华为昇腾处理器驱动的AI开发板新标杆

【OrangePi AIpro&#xff1a;教育、机器人、无人机领域的超级AI大脑&#xff0c;华为昇腾处理器驱动的AI开发板新标杆】 文章目录 一、开箱与初印象1. 初印象2. 上手开机3. 安装和运行 TightVNC 远程桌面3.1. 安装 TightVNC 服务器3.2. 启动 VNC 服务器3.3. 在 Windows 上使用…

clickhouse 特性——clickhouse 基础篇(一)

文章目录 列式存储向量化查询执行引擎数据压缩使用磁盘支持SQL实时数据更新 列式存储 列式存储的目的有两个&#xff0c;一是缩小数据扫描范围&#xff0c;二是减少数据传输大小&#xff0c; 因此列存储和数据压缩通常是伴生的&#xff0c;列存储是数据压缩的前提。列存储的好…

MySQL测试数据

012熟悉测试数据 查看表结构&#xff1a;desc或describe&#xff0c;语法格式&#xff1a;desc或describe 表名 desc dept;查询部门的所有信息 &#xff1a; select * from dept;013查一个字段 语法格式&#xff1a;select 字段名 from 表名;&#xff08;大小写都可以&…

SpringBoot——基于Spring Task实现定时任务

目录 定时任务 项目总结 新建一个SpringBoot项目 pom.xml无需引入依赖 SpringTaskDemo SpringbootSpringtaskApplication启动类 定时任务 在日常的项目开发中&#xff0c;往往会涉及一些需要做到定时执行的代码&#xff0c;例如自动将超过24小时的未付款的订单改为取消状…

finetuning大模型准备(基于Mac环境)

为finetuning进行的热身准备&#xff0c;涉及周边的软件工具&#xff0c;方法。 问题1&#xff1a;finetuning过程较长&#xff0c;采用系统自带命令行没有后台&#xff0c;前台被杀后&#xff0c;容易造成训练失败。 解决方法&#xff1a; tmux可以开启后台训练 问题2&…

地下停车场FM信号覆盖系统技术原理用与应用

随着我国城市化水平的快速推进与房地产的快速发展&#xff0c;城市停车场称为每栋建筑物的硬性配套建筑&#xff0c;尤其是商业综合体、医院、政府机关、机场、高铁站等场所出现了超大规模停车场&#xff0c;停放车辆可达数千辆&#xff0c;停车场的智能化与信息化水平也越来越…

echarts-事件

echarts部分事件 添加点击事件 添加点击事件&#xff1a; let options {tooltip: {},xAxis: {type: "category",data: ["d1", "d2", "d3", "d4"],},yAxis: {},series: [{type: "line",data: d1,},{type: &qu…

推送镜像到私有harbor仓库

本地已制作镜像&#xff1a;tomcat-8.5.100-centos7.9:1.0。 本地已经搭建私有仓库&#xff1a;harbor.igmwx.com。 现在需要把镜像 tomcat-8.5.100-centos7.9:1.0 推送到harbor。 &#xff08;1&#xff09;查看本地镜像&#xff1a;sudo docker images zhangzkzhangzk:~/d…

Java Object类方法介绍

Object作为顶级类&#xff0c;所有的类都实现了该类的方法&#xff0c;包括数组。 查询Java文档&#xff1a; 1、object.eauqls(): 其作用与 有些类似。 &#xff1a; 是一个比较运算符&#xff0c;而不是一个方法。 ①可以判断基本类型&#xff0c;也可以判断引用类型。 ②若…

黑马python-面向对象程序设计

1.定义类 class 类名&#xff1a; 代码 ….. 注意&#xff1a;类名要满足标识符命名规则&#xff0c;同时遵循大驼峰命名习惯 2.self&#xff1a; self指调用该函数的对象 3.创建对象 对象名类&#xff08;&#xff09; 4.添加获取对象属性 对象名.属性名值 5._init_()方法&…

vs2010特殊字符‘’无法显示

记录一下&#xff0c;某天测试组的同事突然发了个邮件&#xff0c;说显示有问题 一看邮件内容&#xff0c;果然出bug了 修改办法如下&#xff1a; 把资源文件中的‘&’改成‘&&’&#xff0c;这样在使用的时候就能用了 成功