前言
刷题根据“代码随想录”流程完成,所以可以对照参考。
总结数组操作技巧。
知识点
来源【代码随想录】,挑出重点:
(1)考察数组的题目主要是考察对代码的掌控能力。
(2)数组直接通过下标获取数据。
(3)数组在内存空间的地址是连续的,所以在删除或者增添元素的时候,就难免要移动其他元素的地址。
(4)如果使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。(vector可以自动管理内存,有成员函数,array动作就需要自己手动实现)
(5)相信大家有遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,拆了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实真正解决题目的代码都是简洁的,或者有原则性的,深有体会。
思路
遇到数组操作,应该放哪方面想?
(1)双指针法:
- 原理:两个指针操作同一个数组,可以降低时间复杂度,相比与暴力解法,暴力解法就是两个for循环。注意:这里的指针不是int* p;指针变量的意思,就是下标索引而已,直接定义int i,j; 即可。
- 两个指针巧妙使用:
- 从同一端出发出发——【删除元素】,数组覆盖前移;
- 从两端出发——【有序数组的平方】;
- 滑动窗口——【最短子数组长度】
(2)循环不变量
- 整个循环中,坚持区间统一原则,左闭右开或左闭右闭;从一而终。这样才能逻辑不混乱,不漏掉元素,也不重复操作元素。
- 二分搜索法:前提——有序数组,找特定元素。
- 时间复杂度:O(n)
- 不要漏掉元素,也不重复操作元素。
- 螺旋数组
- 找到循环时,可以扩大范围,不要把一个while循环内for循环还多拆几步(个人第一次尝试的解法)。直接把一轮操作当做整体。
- 转角元素最好交给下一棒for循环处理。这个方便操作。注意不要重复操作转角元素。
总结
数组篇典型题目结束,继续链表篇;
为巩固复习,穿插练习数组额外题目。
(欢迎指正,转载标明出处)