代码随想录-刷题第二天

977. 有序数组的平方

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

思路:双指针思想,数组是有序的且含有负数,其中元素的平方一定是两边最大。定义两个指针,从两端开始向中间靠近,每次比较两个指针的元素平方大小,将较大的一个存入结果数组。(注意结果数组是从小到大的,所以要从后往前开始存入

时间复杂度:O(n),空间复杂度O(n)

class Solution {public int[] sortedSquares(int[] nums) {int n = nums.length;// 两个指针分别初始化在正负子数组绝对值最大的元素索引int i = 0, j = n - 1;// 得到的有序结果是降序的int p = n - 1;int[] res = new int[n];// 执行双指针合并有序数组的逻辑// 注意这里要i <= j,因为最后要处理两个元素while (i <= j) {if (Math.abs(nums[i]) > Math.abs(nums[j])) {res[p] = nums[i] * nums[i];i++;} else {res[p] = nums[j] * nums[j];j--;}p--;}return res;}
}

也可以使用for循环写法

public int[] sortedSquares(int[] nums) {int left = 0, right = nums.length - 1;int[] res = new int[nums.length];int p = res.length - 1;for (int i = 0; i < res.length; i++) {if (nums[left] * nums[left] > nums[right] * nums[right]){res[p] = nums[left] * nums[left];left++;}else {res[p] = nums[right] * nums[right];right--;}p--;}return res;
}

209. 长度最小的子数组

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

思路:滑动窗口,两个指针代表窗口的左右边界,右边界一直遍历到最后,当窗口中元素和大于目标值的时候,更新结果,并且左边界往前走一步。(注意:这里一定是窗口右边界遍历一次,然后根据条件更新左边界。如果左边界作为遍历条件,一次循环是解不出来的。)

时间复杂度:O(n)

为什么时间复杂度是O(n) ?

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

class Solution {public int minSubArrayLen(int target, int[] nums) {int i = 0;    // i代表窗口左边界int j = 0;    // j为窗口右边界int res = nums.length + 1;    // 定义结果为最大int total = 0;     // total存放窗口中元素和while (j < nums.length) {total = total + nums[j];j++;// 窗口中元素符合题意,更新结果,更新左边界和totalwhile (total >= target) {res = Math.min(res, j - i);total = total - nums[i];i++;}}return res == nums.length + 1 ? 0 : res;}
}

59. 螺旋矩阵II

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

思路:本题并不涉及什么算法,就是模拟过程,但却十分考察对代码的掌控能力。借用代码随想录中的图片容易理解。注意每次只需要改变二维数组行或列的坐标。

img

时间复杂度:O(n)

class Solution {public int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int upper_bound = 0, lower_bound = n - 1;int left_bound = 0, right_bound = n - 1;// 需要填入矩阵的数字int num = 1;while (num <= n * n) {if (upper_bound <= lower_bound) {// 在顶部从左向右遍历for (int j = left_bound; j <= right_bound; j++) {matrix[upper_bound][j] = num++;}// 上边界下移upper_bound++;}if (left_bound <= right_bound) {// 在右侧从上向下遍历for (int i = upper_bound; i <= lower_bound; i++) {matrix[i][right_bound] = num++;}// 右边界左移right_bound--;}if (upper_bound <= lower_bound) {// 在底部从右向左遍历for (int j = right_bound; j >= left_bound; j--) {matrix[lower_bound][j] = num++;}// 下边界上移lower_bound--;}if (left_bound <= right_bound) {// 在左侧从下向上遍历for (int i = lower_bound; i >= upper_bound; i--) {matrix[i][left_bound] = num++;}// 左边界右移left_bound++;}}return matrix;}
}

数组题目总结

数组的题目的主要解法有以下几种:

二分法

遇到有序数组,需要进行查找操作的时候,可以考虑二分法。

双指针法

双指针法里面比较重要的,是快慢指针法。当一个指针无法解题,或者需要使用一次循环完成两次循环里才能解决的问题时,需要考虑使用双指针。双指针的种类很多,滑动窗口也可以看作双指针法。

滑动窗口

滑动窗口是一种很巧妙的方法,可以不断的调节子序列的位置。当我们遇到需要查找符合条件的子序列时,可以考虑滑动窗口。

模拟行为

这种题目就是考察代码逻辑能力,但是要注意遵守循环不变量原则,二分法中也用到了循环不变量原则,其实就是保证循环过程中,定义的循环范围不要改变,例如:不要再一个开区间的循环中,做闭区间的循环操作,这样的代码逻辑十分混乱。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈面向对象

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 从某个角度说&#xff…

GPT-4充当“规划师、审计师”,颠覆性双层文生图表模型

DALL-E 3、Midjourney、Stable Diffusion等模型展现出了强大的创造能力&#xff0c;通过文本便能生成素描、朋克、3D、二次元等多种类型的高质量图片&#xff0c;但在生成科学图表&#xff08;柱状、直方、箱线、树状等&#xff09;方面却略显不足。 这是因为模型在生成图表时…

微信怎么发状态?简单教程,一学就会!

微信是一个非常实用的社交应用&#xff0c;不仅提供了基础的聊天功能&#xff0c;还推出了很多其他有趣的功能。比如微信个人状态&#xff0c;这个功能可以让用户随时随地分享自己的心情和动态。那么&#xff0c;微信怎么发状态呢&#xff1f;本文将为大家介绍有关微信发状态的…

PlayCover“模拟器”作弊解决方案

当下的游戏市场&#xff0c;移动游戏已占据了主导地位&#xff0c;但移动端游戏碍于屏幕大小影响操作、性能限制导致卡顿等因素&#xff0c;开始逐步支持多端互通。但仍有一些游戏存在移动端与 PC 端不互通、不支持 PC 端或没有 Mac 版本&#xff0c;导致 Mac 设备体验游戏不方…

『亚马逊云科技产品测评』活动征文|构建生态农场家禽系统

『亚马逊云科技产品测评』活动征文&#xff5c;构建生态农场家禽系统 授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 前…

AIGC|一次性了解向量数据库原理及应用,小白也能读懂的入门知识!【建议收藏】

目录 一、向量数据库是什么 &#xff08;一&#xff09;向量数据库发展历史 &#xff08;二&#xff09;向量是什么 二、向量数据库的应用场景 &#xff08;一&#xff09;向量数据库应用场景 &#xff08;二&#xff09;向量数据库产品 &#xff08;三&#xff09;向量数…

软件测试入门很容易,但想要深造就还是要费功夫

现如今&#xff0c;越来越多的外行人员开始转战到软件测试岗位&#xff0c;而这也让许多不了解软件测试人疑惑“软件测试有那么好学吗&#xff1f;为什么都开始转行到软件测试呢&#xff1f;” 而关于这两个问题的答案&#xff0c;作者在以下为大家进行了讲解&#xff0c;希望…

PLC信号发生器(余弦信号)

SMART PLC正弦信号发生器算法公式和梯形图代码请查看下面文章链接: PLC信号发生器(梯形图)-CSDN博客文章浏览阅读393次。PLC信号发生器(SCL语言)的详细介绍请参看下面文章PLC信号发生器(博途SCL)_RXXW_Dor的博客-CSDN博客信号发生器的应用请参看下面的博客文章,在演示滤波器…

BLE协议栈入门学习

蓝牙LE栈 物理层 频带 蓝牙LE在2400MHz到2483.5MHz范围内的2.4GHz免授权频段工作&#xff0c;该频段分为40个信道&#xff0c;每个信道间隔为2MHz。 时分 蓝牙LE是半双工的&#xff0c;可以发送和接收&#xff0c;但不能同时发送和接收&#xff0c;然而&#xff0c;所有的设…

echarts 实现3D立体柱状图示例

该示例有如下几个特点&#xff1a; ①实现tooltip自定义样式&#xff08;echarts 实现tooltip提示框样式自定义-CSDN博客&#xff09; ②数据为0时&#xff0c;顶部四边形不展示 ③legend图标设置为自定义图片 【第②也是一个难点&#xff0c;我没有找到其他解决办法&#xff…

【性能测试】稳定性测试要点-监控关键指标总结(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、稳定性测试的要…

论文阅读:“iOrthoPredictor: Model-guided Deep Prediction of Teeth Alignment“

文章目录 IntroductionMethodologyProblem FormulationConditional Geometry GenerationTSynNetAligned Teeth Silhouette Maps Generation ResultsReferences Github 项目地址&#xff1a;https://github.com/Lingchen-chen/iOrthopredictor Introduction 这篇文章提出了一种…