算法复习-数组
数组双指针——左右指针
两端向中间
n数之和
有序数组的平方
-4 0 12 15 按平方大小重排
思路:两个指针分别指向数组的两端,比较两端元素的平方大小,将较大的平方放到结果数组的末尾,并移动对应的指针,直到两个指针相遇。
回文串相关
中间向两端(最长回文子串)
遍历每一个“中心”向外扩散(从一个中心扩散或者两个中心扩散)
1 | for 0 <= i < len(s): |
二分查找
数组有序就考虑
找一个元素
左闭右开区间[left, right)
- while(left < right) 因为当left == right时,区间已经没有元素了,可以跳出
- left = mid + 1; left所指的元素还要再找,所以指向跳过mid这个元素的位置
- right = mid; right所指向的mid刚好不用再找
1 | int binarySearch(vector<int>& nums, int target){ |
数组双指针——快慢指针
去重/删除/移动元素
一个慢指针用来写,一个快指针用来在前面扫
1 | int slow = 0, fast = 0; |
滑动窗口(重点)
同样用左闭右开区间。slow fast指针不回退,所以只用O(n)扫一遍数组,O(n2)全遍历的部分情况不用扫
问三个问题:
- 窗口什么时候右移?(fast++)
- 窗口什么时候左移?(slow++)
- 什么时候更新结果?
外循环更新right,内循环更新left
1 | // 滑动窗口算法框架伪码 |
- 最小覆盖子串
维护need,window两个unordered_map哈希表,字符移入移出时更新window,当某个字符是need所需且符合/不符合数量时更新valid,valid == need.size()时说明窗口已经覆盖了need,进入内循环更新结果并缩小窗口1
2unordered_map<char, int> need, window;
if(need.count(c)) // 判断c是否在need中
小巧思遍历技巧
n*n二维方阵原地旋转
先主对角线翻转,再水平翻转
螺旋矩阵
待补充
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 魔法使的后花园!
