部分内容来源于 https://www.programmercarl.com/
0.前言
在大部分编程语言中,都包含了数组这个最基础的数据结构。有关数组的算法题一般都不难,首先深入了解数组的构成,再记住一些独特的方法,那么做起题目来会更加的得心应手。
注意:不要因为题目简单就直接上手写!所谓磨刀不误砍柴工。首先要认真读题!其次要理清思路!最后再动手!
1.数组基础结构
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,其底层存储是连续的。
首先,数组的索引读取,要从0开始,到(长度-1)结束。
其次,因为数组的存储是连续的,因此对于数组来说,如果想删除某个元素,或者添加某个元素的时候,我们必须要移动其他元素(对比链表来说,数组的读取更加方便,链表删除和添加更加方便)。
GO语言中,要注意理清切片与数组的区别。切片是引用类型,其底层实际上只存了地址、容量、长度,而数组中是扎扎实实存了很多数据的。具体的区别解析可以看以下文章:
2.数组题常用思路
2.1 找到正确的区间
在做数组类题目的时候,经常会因为找不到题目所给区间的正确关系,而产生一些奇怪的错误。如在二分查找的题目中,如果能明确是开区间还是闭区间,那么解题会非常简单。
题目推荐:
https://leetcode.cn/problems/binary-search/
https://leetcode.cn/problems/N6YdxV/
2.2 滑动窗口思想
可以通过设置一个滑动窗口,根据题目要求,动态的改变窗口的大小,可以解决很多数组类型的题目。在使用此方法时,要注意滑动窗口退出的条件、移动的条件以及最终结果的获取。
https://leetcode.cn/problems/minimum-size-subarray-sum/
https://leetcode.cn/problems/longest-substring-without-repeating-characters/
2.3 双指针思想
设置一个快慢指针,根据题目要求,合理的设置快慢指针的递增,可以解决很多数组和链表的问题。
https://leetcode.cn/problems/3sum/
2.4 模拟
很多题目思路非常简单,就是要按照题目的思路进行模拟,这个时候考验的就是我们代码的实际编写能力。
题目推荐:
https://leetcode.cn/problems/add-binary/
https://leetcode.cn/problems/spiral-matrix/
https://leetcode.cn/problems/spiral-matrix-ii/