算法面试题:数组类top20(简洁只讲核心思路)

数组是算法面试的必考领域,我为你精选了 20 道最高频的题目,并按照其核心解题思想进行了分类,希望能协助你快速抓住重点。

下表汇总了全部问题,你可以快速概览。表格后会对每一类问题的核心思想进行简要说明。

类别

问题名称

题目描述(一句话)

核心思路(一句话)

基础操作

1. 两数之和 (Two Sum)

在数组中找到两数,使它们的和等于目标值。

使用哈希表存储遍历过的值及其索引,检查目标值 – 当前值是否在表中。

2. 求最大/最小值

找出数组中的最大值和最小值。

遍历分治法。分治即比较左右两半的最大最小值。

3. 求最大和次大值

找出数组中的最大值和次大值。

分治法。分别找出左右两半的最大次大值,再合并比较。

4. 出现次数超一半

找出在数组中出现次数超过一半的元素(主元素)。

摩尔投票法。不同元素相互抵消,最后剩下的候选者可能就是主元素。

排序与搜索

5. 合并区间

将重叠或相邻的区间合并。

按区间起点排序后,依次判断相邻区间是否能合并。

6. 数组第K大元素

找出数组中第K大的元素。

使用快速选择算法,基于快速排序的划分思想。

7. 搜索旋转排序数组

在一个可能在某点旋转过的有序数组中搜索目标值。

修改二分查找。通过比较中点与端点值,判断哪部分有序,并判断目标值位于哪部分。

双指针技巧

8. 三数之和

找出所有不重复的三元组,使它们的和为0。

排序,固定一个数,对后续数组用双指针寻找两数之和。

9. 盛最多水的容器

用数组索引作为宽度,值作为高度,求最大矩形面积。

对撞指针。左右指针向中间移动,每次移动高度较小的指针,更新最大面积。

10. 删除排序数组重复项

原地删除排序数组中的重复元素,返回新长度。

快慢指针。慢指针指向已去重部分的末尾,快指针遍历,遇到不同元素则放入慢指针后。

滑动窗口

11. 最长无重复子串

找到字符串中最长的不包含重复字符的子串。

滑动窗口。用双指针表明窗口,用集合记录窗口内字符,移动右指针扩大窗口,遇重复则收缩左指针。

12. 滑动窗口最大值

给定数组和窗口大小,找出所有滑动窗口中的最大值。

使用单调双端队列维护窗口内可能成为最大值的索引。

动态规划

13. 最大子数组和

找出和最大的连续子数组。

动态规划。dp[i]表明以i结尾的最大和,dp[i] = max(nums[i], dp[i-1] + nums[i])。

14. 最长递增子序列

找到最长严格递增的子序列(不要求连续)。

动态规划。dp[i]表明以nums[i]结尾的LIS长度。或用贪心+二分维护最小尾部数组。

15. 编辑距离

计算将单词A转换成单词B所需的最少操作次数(增、删、替)。

动态规划。dp[i][j]表明A前i个字符转成B前j个字符的编辑距离,分情况讨论。

16. 打家劫舍

不能偷窃相邻的房屋,求能偷窃到的最高金额。

动态规划。dp[i] = max(dp[i-1], dp[i-2] + nums[i]),表明当前偷或不偷的最大收益。

矩阵与多维

17. 旋转图像

将 n × n 的矩阵顺时针旋转90度。

沿主对角线翻转,再每一行反转;或分层处理四边元素交换。

18. 矩阵中的路径

判断字符矩阵中是否存在某条路径字符串。

回溯法。从每个点开始DFS,匹配字符串,失败则回溯,注意标记已访问。

19. 岛屿数量

计算由'1'(陆地)和'0'(水)组成的网格中岛屿的数量。

DFS/BFS。遍历网格,遇到未访问的'1',则进行深度/广度优先搜索,标记整个岛屿。

特殊技巧

20. 下一个排列

将数组重新排列成字典序中下一个更大的排列。

1. 从右找第一个较小数a[i]。2. 从右找第一个大于a[i]的数a[j]并交换。3. 反转a[i]之后的序列。


核心解题思想点睛

上述问题可以归类到几种强劲的解题思想下,理解这些思想比死记硬背更有效。

  1. 双指针 (Two Pointers):这是处理数组和字符串的利器。
  2. 对撞指针:一左一右向中间移动,适用于有序数组的求和、比较等问题(如三数之和、盛水容器)。
  3. 快慢指针:一快一慢同向移动,常用于链表(判断环)和数组(去重、找中点)。
  4. 滑动窗口 (Sliding Window):主要解决数组/字符串的连续子区间问题。通过动态维护一个窗口,用双指针标记边界,根据条件移动左右指针来滑动窗口,避免重复计算。
  5. 动态规划 (Dynamic Programming):解决具有最优子结构重叠子问题的复杂问题。关键是定义好dp数组的含义,找出状态转移方程,并确定初始条件。
  6. 哈希表 (Hash Map):以空间换时间的典型。用于快速查找、计数和记录信息,常作为辅助工具优化算法(如两数之和)。
  7. 二分查找 (Binary Search):不仅用于有序数组的准确查找,其变体也能高效解决边界问题旋转数组搜索最大值最小值问题。
  8. 回溯法 (Backtracking):一种通过试错来寻找所有(或部分)解的算法。当探索到某步发现当前选择达不到目标,就回溯(撤销)上一步的选择,另辟蹊径。适合解决排列、组合、棋盘类问题。
© 版权声明

相关文章

暂无评论

none
暂无评论...