1.力扣977 有序数组的平方
问题描述:对于一个非递减数组,将其每个元素平方后,在使其按升序排好。
思路:1.暴力解法:直接for循环让每个元素平方,再sort排序,时间复杂度为O(n+logn)
2.双指针法:由于原数组已经有序,则最大一定出现在数组的两头,那么可以新建一个数组存放 结果,有i,j两个指针分别指向原数组的头和尾,然后比较头尾的平方,大的放在新数组的最后,然后 i,j不断向里逼近,知道i>j时结束。时间复杂度为O(n)
代码如下:
1.暴力解法:
2.双指针法:
总结:暴力解法思路简单明了,就是平方+排序。双指针法利用了有序数组的性质,即最大平方元素一定出现在数组的两头,然后便可不断缩小区间,获取区间两头的较大值存放在新数组result里。
2.力扣209.长度最小字符串
问题描述:给一个正整数target,求当前数组nums中的一个最小的连续的字符串的累积和可以使得其恰好大于或等于target。
思路:
1.暴力解法:相对清晰,但依然有一些细节,比如需要一个临时的长度subLebngth来实时更新长度,需要运用到三目运算符(?:)来便于比较subLength和result。总体上就是第一层循环i遍历时,第二层循环j先后寻找累加sum,直到找到符合条件的位置,计算此时subLength并与result比较。时间复杂度为O(n^2),会超时。
2.滑动窗口法:比较巧妙,精髓在于根据当前的子序列的大小不断的修改子序列的起始位置。由此可以不必像暴力法去机械的一个一个去控制起始位置,并每一次外层循环都需要内层循环从当前位置一个一个向后找,大大减少了时间复杂度,使时间复杂的变为了O(n).
代码如下:
1.暴力解法:2.滑动窗口法:
总结:滑动窗口法的精髓在于子序列可以根据条件的符合情况去自行移动,在运用时要根据题目的情况而定。
3.力扣59.螺旋矩阵II
问题描述:给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:初看这题非常的抽象,完全没有下手的地方,但实际上可以一层一层往里剥开,其主要难点在于区间的控制和对二维数组行列的控制,它的每一条边的处理实际上就是要么控制行不变改变列 要么是控制列不变改变行。另外的细节就是保持offset、startX、startY的更新以及n为奇数要另外赋值最后的元素。
****代码如下:
总结:该题目主要是抽象模拟,存在一定的数学规律,即层数为n/2。再摸进去后其实就是一个区间控制和一个行列的单独控制。细节就是n为奇数时不要忘了中间的那个数以及offset的更新。