代码随想录算法训练营第二天| 977. 有序数组的平方、59.螺旋矩阵II。

本文主要是介绍代码随想录算法训练营第二天| 977. 有序数组的平方、59.螺旋矩阵II。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

977.有序数组的平方

文档讲解:代码随想录

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

1.最先是对题目有点看不懂,为啥会强调非递减,元素平方后负数会变为正数,原有的非递减顺序会改变。最直接想到的是直接数组每个元素求平方然后对数组排序。

2.非递减这个条件利用的好,较大的数位于数组两端,这就为用双指针解法创造了条件,这个题目没有要求数组原地操作,所以定义left,right指针指向原数组,k指针指向函数返回的新数组,依次比较left,right指向元素平方和的大小,较大的值赋值给k指针指向的位置,较大的指对应的指针移动(向右或向左),k指针后移,知道left>right结束。

3. 第一次用暴力解法做,在排序哪里用了冒泡排序,但内层循环本来是遍历的j, 结果用了外层循环的i,导致用例报错。用双指针法在循环结束条件处应该是当left<=right继续循环,因为当left=right时left或right指向的元素一直没有放到新数组中去,但最后一次需要放进去。

4.学会了要充分利用题中的条件,比如非递减用双指针就比较好。然后就是边界条件用一个特殊情况去分析是否取等号,这个题学习了近一个小时。

59.螺旋矩阵II

文档讲解: 代码随想录

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

1. 第一次看到这个题目,不知道这个题如何做,只知道可能要利用下标关系,没有发现这个过程有何规律。

2.首先是这个规律看得很准,就是将这个过程分解为几圈和中间位置的处理,只有n为奇数时才会有中间位置,中间位置也就是模拟过程的最后一步,转多少圈可以通过n/2取整来计算,最关键的还是要定义好循环不变量,比如用左闭右开的原则就要坚持每条边都用左闭右开的原则。每次转完一圈后就更新转圈的起始位置,横纵坐标加1就可以完成,然后在转每一个圈中,左闭右开这个边界通过引入一个offset变量控制,初始值为1, 转完一圈后offset加1。如果是奇数,最后一步还需要将中心位置赋值。

3.首先没有搞清楚循环的条件是啥,应该是转多少圈,用n/2取整获得转的圈数。然后是数组索引的部分,没有想清楚哪里用startX,startY,i,j这些变量,用startX,startY初始化i,j后需要用i,j来定位,i,j是记录着当前位置的信息,startX,startY本身只在转完一圈后再执行+1的操作。

4.体会到了用好循环不变量的重要性,整个思维过程比较严谨且可控,学习了一个小时左右,第一次真正实现了这种精确的计算机模拟算法。

这篇关于代码随想录算法训练营第二天| 977. 有序数组的平方、59.螺旋矩阵II。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036425

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型