如何高效掌握二分、哈希表、堆、优先队列等面试高频算法题?
摘要:本文将覆盖 + + + 方面的面试算法题,文中我将给出: 1. 面试中的题目 2. 解题的思路 3. 特定问题的技巧和注意事项 4. 考察的知识点及其概念 5. 详细的代码和解析 在开始
本文将覆盖 二分 + 哈希表 + 堆 + 优先队列 方面的面试算法题,文中我将给出:
面试中的题目
解题的思路
特定问题的技巧和注意事项
考察的知识点及其概念
详细的代码和解析
在开始之前,我们先看下会有哪些重点内容:
现在就让我们开始吧!
二分
概念:
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
基本思路:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较
如果两者相等,则查找成功
否则利用中间位置记录将表分成前、后两个子表
如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表
否则进一步查找后一子表
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分搜索
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
技巧:
分析二分查找的一个技巧是:
不要出现 else,而是把所有情况用 if / else if 写清楚
这样可以清楚地展现所有细节。
这里我们以递归和非递归方式,解决面试中的二分搜索题
递归
思路很简单:
判断起始点是否大于终止点
比较 nums[mid] 与目标值大小
如果 nums[mid] 大,说明目标值 target 在前面
反之如果 nums[mid] 小,说明目标值 target 在前面后面
如果既不大也不小,说明相等,则返回当前位置
class Solution {
public int search(int[] nums, int target) {
return binarySearch(nums, 0, nums.length - 1, target);
}
private int binarySearch(int[] nums, int start, int end, int target) {
if(start > end) {
return -1;
}
int mid = (end + start) / 2;
if(nums[mid] < target) {
return binarySearch(nums, mid + 1, end, target);
}
if(nums[mid] > target) {
return binarySearch(nums, start, mid - 1, target);
}
return mid;
}
}
非递归
这个场景是最简单的:
搜索一个数
如果存在, 返回其索引
否则返回 -1
int binarySearch(int[] nums, int target) {
int left = 0;
// 注意减 1
int right = nums.length - 1;
while(left <= right) {
int mid = (right + left) / 2;
if(nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1; // 注意
else if (nums[mid] > target)
right = mid - 1; // 注意
}
return -1;
}
相关视频
分钟教你二分查找(python版)
X的平方根
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
