Day2 数组part2
一、有序数组的平方
题目见Leetcode-977
可以直接平方之后再排序,但是观察可以发现:平方之后最大的数不是最左边的数,就是最右边的数
因此,可以考虑使用双指针 → 分别指向输入数组的左右两侧,平方比较之后,用另一个新的指针由右向左赋值在新开辟的内存空间中,这样的时间复杂度是O(n)
while
循环的终止条件是left≤right
二、最小长度子数组
题目见Leecode-209
要求得到子数组元素和≥target的最短子数组
想法很自然使用双指针 → 快慢指针维护一个刚刚好满足子数组和≥target的边界,一但满足(fast指针走多了),缩短左边界(slow指针左移动),每次记录满足要求时数组的最小长度,数组不满足题意时,fast指针接着往后走,将数组做大。
宏观上,这个滑动窗口左右反复伸缩,窗口长度变化,但内部子数组数值和始终在满足条件的临界
需要注意的是,在while
判断fast
指针没有到达最右侧边界的外层循环中:
fast = fast + 1
的自增操作要放在最后一句话,否则循环内层再次使用fast会产生index越界的问题
此外,满足条件的子数组长度是fast-slow+1
,不要忘记+1
三、螺旋数组填充
题目见Leetcode-59
这道题很考验技巧性,这里的题解很直观: