代码随想录算法训练营第二天| 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.学会了要充分利用题中的条件,比如非递减用双指针就比较好。然后就是边界条件用一个特殊情况去分析是否取等号,这个题学习了近一个小时。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值