第二天的主题是 two pointers,一道简单题,一道困难题。
977. Squares of a Sorted Array
Analysis
这个题第一眼看到后,脑子里面浮现出来的解法,就是直接算,然后排序。尝试了一下,也是可以这样做的。不过,既然出现在双指针这里,应该可以用双指针来做。
用双指针处理有 2 种思路:
- 从中间向两边遍历,这样需要先找到中间值,可以认为中间值是平方后数组的最小值,也可以认为是数组中正负数的分界点(题目已经限定是非降序数组,所以正负数是分别分布在两边的)。
- 从两边向中间遍历,这样每次选出来的值实际上是数组剩余数字中的最大值,所以需要逆序一下。
Code
method 1
1 | class Solution { |
method 2
这里选择平方后最小值为中间值。
1 | class Solution { |
method 3
1 | class Solution { |
189. Rotate Array
Analysis
这个题很经典,做法很多,是做过很多次的题目了。
用 reverse 函数是最简单直观、而且消耗低的做法了,如果用直接交换数字的方法,需要计算出遍历的次数,但是实际上可以单独设置一个 count,用来记录交换的次数,一旦等于 n 说明都交换过了,就可以退出循环了,这样也是可以的。
Code
method 1
1 | /* method 1: use queue, but cost many memory */ |
method 2
1 | /* method 2: use vector, also cost many memory */ |
method 3
1 | /* method 3: use reverse function */ |
method 4
1 | class Solution { |
Summary
有时候用双指针来解决一些问题时,可能会有奇效,整体而言,思路不算难。