代码随想录算法训练营第2天|LeetCode977,209,59

977.有序数组平方

题目链接: 977. 有序数组的平方 - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解: 双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili

第一想法

暴力算法肯定是先将元素平方,然后Arrays.sort(),时间复杂度取决于快排O(n logn)

代码随想录

有序数组 [ -5 -3 1 3  5] 按从小到大排列,其平方之后两边一定是最大的,中间一定是最小的,所以定义双头指针,每次筛选出最大值,从新数组result的最大索引处填入。这样更新一轮下来,新数组就会从大到小填好。

定义双头指针比较出最大的元素有些像快速排序算法。

遇到问题

若先将元素更新为平方,然后再用于比较,那么这个元素如果这次尚未选中,下轮就会继续平方。所以这个判断逻辑应放到比较条件里。

代码

class Solution1 {
    public int[] sortedSquares(int[] nums) {
        int[] result = new int[nums.length];//定义新数组,大小应与原数组相同
        int left = 0;
        int right = nums.length - 1;//定义原数组双头指针
        int index = nums.length - 1;//定义填充新数组的索引指针
        for(;left<=right;){//left==right有意义应当进入循环
            if(nums[left]*nums[left]>nums[right]*nums[right]){
                result[index--] = nums[left]*nums[left];//若左边元素大,则复制给新数组,左边索引+1
                left++;
            }
            else{
                result[index--] = nums[right] * nums[right];//若右边元素大,则复制给新数组,右边索引-1;或者两边相同,则选谁填充都无所谓
                right--;
            }
        }
        return result;
    }
}

209.长度最小的子数组

题目链接: 209. 长度最小的子数组 - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili

 第一想法

首先一定是暴力想法,逐个数组遍历,若总和满足>=target,则记录数组长度,与上次符合要求的子数组结果作比较,若长度更小,则更新子数组。

代码随想录想法

用一个循环解决问题,那么j指的是子数组的终止位置,其起始位置的确定就在于滑动窗口的策略实现。如果指的是起始位置,那么只有一个一个向后遍历才能返回子数组,思路和暴力解法一致。

移动起始位置的条件是一旦当数组子数组之和>=target之后,起始指针就向后持续移动缩小数组。所以关键在于while循环而非if的单次判断。

一些录友会疑惑为什么时间复杂度是O(n)

不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)

代码

class Solution1 {
    public int minSubArrayLen(int target, int[] nums) {
        int subLength = Integer.MAX_VALUE;
        int sum = 0;
        int beginIndex = 0;
        int endIndex  = 0;
        for(;endIndex<nums.length;endIndex++){
            sum+=nums[endIndex];//终点指针持续向后移动
            while (sum>=target){
                subLength = Math.min(subLength, endIndex - beginIndex + 1);//更新最小长度
                sum -= nums[beginIndex++];//起始指针后移;
            }
        }
        return subLength == Integer.MAX_VALUE ? 0 : subLength;//若未赋值则返回0
    }
}

59.螺旋矩阵 

题目链接: 59. 螺旋矩阵 II - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili

第一想法

没思路,一碰到循环和二维数组就寄

代码随想录思路

确定圈数:n/2,因为每转一圈,边长-2
n%2==1,有余数的话,最后一圈只要一个元素

每条边的处理都遵循左闭右开的原则,第一个节点留给此边处理,最后一个结点留给下一条边处理。

别人优化思路

1.关于中心元素处理:其实可以在初始化res矩阵的时候就直接把全部元素初始化为n*n,这样即使n是奇数,也无需处理中间的元素

2.startx,starty,offset可以优化成一个变量处理。

代码

画了一下四个边角的坐标,数组的边界处理,这个offset变量还是很难把握

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] result = new int[n][n];//新建二维数组
        int loop = 0;
        int startX = 0, startY = 0, offset = 1;//起始X坐标,起始Y坐标,偏移量
        int count = 1;
        while (loop<n/2){
            int i = startX, j = startY;
            //先处理上边界
            for (j = startY; j < n - offset; j++) {//j的最大值应该是倒数第二个元素j<=n-1-offset,即j<n-offset
                result[startX][j] = count++;
            }
            //处理右边界
            for (i = startX; i < n - offset; i++) {//此时j等于n-offset
                result[i][j]=count++;
            }
            //处理下边界
            for(;j>startY;j--){
                result[i][j]=count++;
            }
            //处理左边界
            for(;i>startX;i--){
                result[i][j]=count++;
            }
            startX++;
            startY++;
            offset++;
            loop++;
        }
        if(n%2==1){
            result[startX][startY]=count;
        }
        return result;
    }
}

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

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

相关文章

关于软件本地化,您应该了解什么?

软件本地化是调整软件应用程序以满足目标市场的语言、文化和技术要求的过程。它不仅仅涉及翻译用户界面&#xff1b;它包含一系列活动&#xff0c;以确保软件在目标语言环境中可用且相关。以下是您应该了解的有关软件本地化的一些关键方面&#xff1a; 了解范围 软件本地化是…

【软件测试】之黑盒测试用例的设计

&#x1f3c0;&#x1f3c0;&#x1f3c0;来都来了&#xff0c;不妨点个关注&#xff01; &#x1f3a7;&#x1f3a7;&#x1f3a7;博客主页&#xff1a;欢迎各位大佬! 文章目录 1.测试用例的概念2.测试用例的好处3. 黑盒测试用例的设计3.1 黑盒测试的概念3.2 基于需求进行测…

暗潮短视频:成都柏煜文化传媒有限公司

暗潮短视频&#xff1a;涌动的新媒体力量 在数字化时代的浪潮中&#xff0c;短视频以其独特的魅力和无限的潜力&#xff0c;迅速成为新媒体领域的一股强大力量。而在这片繁荣的短视频领域中&#xff0c;成都柏煜文化传媒有限公司“暗潮短视频”以其独特的定位和深邃的内容&…

论文浅尝 | 从最少到最多的提示可在大型语言模型中实现复杂的推理

笔记整理&#xff1a;王泽元&#xff0c;浙江大学博士 链接&#xff1a;https://openreview.net/forum?idWZH7099tgfM 1. 动机 尽管深度学习已经取得了巨大的成功&#xff0c;但它与人类智慧仍然存在一些明显差距。这些差距包括以下几个方面&#xff1a;1&#xff09;学习新任…

损失函数篇

损失函数 1、边界框损失函数/回归损失函数bbox_loss 2、分类损失函数cls_loss 3、置信度损失函数obj_loss YOLOv8损失函数 1、概述 通过YOLOv8-训练流程-正负样本分配的介绍&#xff0c;我们可以知道&#xff0c;经过预处理与筛选的过程得到最终的训练数据&#xff1a; a…

11 UDP的可靠传输协议QUIC

1.如何做到可靠性传输 2.UDP与TCP,我们如何选择 3.UDP如何可靠,KCP协议在哪些方面有优势 4.KCP协议精讲(重点讲解 5.OUIC时代是否已经到来 UDP如何做到可靠传输 ACK机制重传机制 重传策略序号机制(后发的包可能先到) 3 2 1-> 2 3 1重排机制 2 3 1-> 3 2 1窗口机制 流…

谷粒商城笔记-03-分布式基础概念

文章目录 一&#xff0c;微服务二&#xff0c;集群、分布式三&#xff0c;远程调用四&#xff0c;负载均衡五&#xff0c;服务注册、服务发现、注册中心六&#xff0c;配置中心七&#xff0c;服务熔断、服务降级1&#xff0c;服务熔断2&#xff0c;服务降级3&#xff0c;区别 八…

Spring框架的学习前言

1.注意事项 1.在接下来的学习中我们会将jdk的版本升级到17。 2.引入maven仓库用来存储依赖 3.在后面的javaSpring框架中要第一个项目的创建要选javaweb和lombook这两个依赖 2.Maven的主要功能 &#xff08;1&#xff09;maven的主要功能是引入依赖和管理依赖&#xff0c;在…

基于SpringCloud的分布式架构网上商城

基于SpringCloud的分布式架构网上商城的主要使用者管理员功能&#xff1a;首页、个人中心、用户管理、商品信息管理、商品分类管理、系统管理、订单管理等功能。 &#x1f495;&#x1f495;作者&#xff1a;Weirdo &#x1f495;&#x1f495;个人简介&#xff1a;擅长Java、C…

【SkiaSharp绘图15】SKPath属性详解:边界、填充、凹凸、类型判断、坐标、路径类型

文章目录 SKPath 构造函数SKPath 属性Bounds 边界(宽边界)TightBounds紧边界FillType填充方式IsConcave 是否凹/ IsConvex 是否凸IsEmpty是否为空IsLine是否为线段IsRect是否为矩形IsOval是否为椭圆或圆IsRoundRect是否为圆角矩形Item[] 获取路径的坐标LastPoint最后点的坐标Po…

基于香橙派AIpro搭建的车牌识别系统

引言 本人正有学习嵌入式的想法&#xff0c;正好碰到机会让我搞了块OrangePi AIpro&#xff08;香橙派AIpro&#xff09;开发板&#xff0c;正合我意&#xff0c;直接上手进行体验&#xff0c;顺便给大家分享下我的实践过程。 开发板介绍与初次启动 OrangePiAIPro开发板是香…

WPF UI InkCanvas 导师演示画板 演示 笔记 画笔 识别

<Grid><InkCanvas Name"inkCanvas"/><Button Content"识别" Click"Button_Click" VerticalAlignment"Bottom"/></Grid> 引用内库 Ink ink new Ink(); private void Button_Click(object sender, RoutedEvent…

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用 一、功能描述: 上位机通过CAN总线实现对电机的运动控制,主要包含三种模式:位置模式、速度模式以及力矩模式。驱动器硬件核心为STM32F103C8T6,带相电压采集电路以及母线电压采集电路。其中供电电压12V。 PWM中心对…

Android-卷积神经网络(Convolutional Neural Network, CNN)

一个复杂且在Android开发中常见的算法是图像处理中的卷积神经网络(Convolutional Neural Network, CNN)。CNN被广泛用于图像识别、物体检测和图像分割等任务,其复杂性在于需要处理大量的图像数据、复杂的神经网络结构和高效的计算。 1. 卷积操作(Convolution) 数学原理:…

企业级监控系统Zabbix

文章目录 Zabbix介绍Zabbix架构Zabbix serverZabbix agentZabbix proxy Zabbix Server的安装Zabbix Agent的安装监控主机流程zabbix_get自定义模板和监控项实战用户登录数监控1.指定监控项命令2.重启Agent服务3.在Server上创建监控项4.测试监控项5.查看监控项图形 触发器定义触…

字符设备驱动程序

简单做个模板框架 字符设备开发流程 确定设备号dev_t&#xff0c;动态分配 alloc_chrdev_region() 或静态分配 register_chrdev_region()定义file_opeartion 结构体*fops *&#xff0c;在结构体成员中实现对应的 *open()、read()*等函数。cdev_init() 将 fops 与 cdev 绑定&…

STM32学习历程(day2)

GPIO解释 GPIO(General-purpose input/output) 可以配置为八种输入输出模式 引脚电平 0V-3.3V 部分引脚可容忍5v 输出模式可控制端口输出高低电平 用以驱动LED、控制蜂鸣器、模拟通信协议输出时序 输入模式可读取端口的高低电平或电压&#xff0c;用于读取按键输入、外界…

firefly rk3588 sdk安装问题记录

目录 一、python版本不对 1.1 下载python2.6 1.2 安装python2.6 1.3 安装遇到问题 二、安装hashlib 三、更新3588 SDK代码 一、python版本不对 我的环境的python版本是python3.7。初次安装的时候执行命令报错&#xff0c;说是版本不对导致 fuhdell:rk3588_sdk$ .repo/rep…

centos通过官网下载安装最新版mysql方案

官网下载步骤&#xff1a; 点击DOCUMENTATION mysql的yum仓库Using the MySQL Yum Repository 向下翻&#xff0c;查看安装命令 点击下载mysql安装包 下载对应的版本 不注册&#xff0c;直接下载社区版 下载好的安装包 安装步骤&#xff1a; 把rpm包导入到服务器…

AI 驱动的数据中心变革与前景

文章主要探讨了AI计算时代数据中心的转型&#xff0c;涉及计算技术的多样性、规格尺寸和加速器的发展、大型语言模型&#xff08;LLM&#xff09;的发展、功耗和冷却趋势、基准测试的重要性以及数据中心的发展等方面。为大家提供深入了解AI基础设施发展的视角。 计算技术的多样…