一、引言
数组是一种线性表结构。语言中给数组分配内存时是一次性整体分配相邻的固定内存。数组对索引读友好,对扩缩容代价高。
因为数据结构比较简单,面试中数组相关题目出现会比较高频。比如排序、搜索、排列组合、集合甚至动态规划类型题型都是围绕数组来的。
二、高频面试题
滑动窗口的最大值
/**
* 长度为 K 的滑动窗口的最大值,结果为arr.length - k + 1的数组
* 双端队列 deque 中保存的是滑动窗口中递减的元素值
* @param arr
* @param k
* @return
*/
private static int[] maxSlide(int[] arr, int k) {
if(arr.length < k) return new int[0];
int[] ans = new int[arr.length - k + 1];
Deque<Integer> deque = new ArrayDeque<>();
for(int i = 0; i < arr.length; i++) {
// 双端队列中最左元素超过 K 范围时清理掉
if(!deque.isEmpty() && i - deque.peek() >= k) deque.remove();
// 双端队列右侧加入元素时把前面小于当前元素的都出队
while(!deque.isEmpty() && arr[deque.peekLast()] <= arr[i]) deque.removeLast();
deque.add(i);
// 至少 k 个元素时把双端队列最左元素加入答案中
if(i + 1 >= k) {
ans[i + 1 - k] = arr[deque.peek()];
}
}
return ans;
}
三、总结
数组好构造,题目沟通起来简单,多种算法都可以在数组上衍生,是算法面试中高频的数据结构。