- 数组与字符串
==================================================================================================================
1.1 两数之和(Two Sum)
问题描述:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数,返回它们的下标。
示例:
java
复制
输入:nums = [2, 7, 11, 15], target = 9
输出:[0, 1]
解法:使用哈希表存储已遍历的元素,时间复杂度为 O(n)。
public class TwoSum {
public static int[] twoSum(int[] nums, int target) {
// 创建一个HashMap来存储数组元素及其对应的下标
Map<Integer, Integer> map = new HashMap<>();
// 遍历数组for (int i = 0; i < nums.length; i++) {int complement = target - nums[i];// 检查HashMap中是否存在与当前元素相加等于目标值的元素if (map.containsKey(complement)) {// 如果存在,返回这两个元素的下标return new int[] { map.get(complement), i };}// 如果不存在,将当前元素及其下标存入HashMapmap.put(nums[i], i);}// 如果没有找到满足条件的两个数,抛出异常throw new IllegalArgumentException("No two sum solution");
}public static void main(String[] args) {int[] nums = {2, 7, 11, 15};int target = 9;int[] result = twoSum(nums, target);System.out.println("Indices: " + result[0] + ", " + result[1]);
}
}
查找数组中两个数的和等于目标值的算法(通常称为 Two Sum 问题)是一个非常经典的算法问题,它在实际编程中有广泛的应用场景。以下是一些常见的业务场景:
- 金融领域:投资组合优化
场景:在股票市场或基金市场中,投资者可能需要找到两只股票或基金,使得它们的价格之和等于某个目标值。
应用:通过该算法,可以快速筛选出符合条件的投资组合,帮助投资者做出决策。
- 电商平台:优惠券或满减活动
场景:在电商平台中,用户可能有两张优惠券,系统需要找到两件商品,使得它们的价格之和等于某个目标值(例如满减活动的门槛)。
应用:通过该算法,可以快速推荐符合条件的商品组合,提升用户体验。
- 游戏开发:道具或装备组合
场景:在游戏中,玩家可能需要找到两件道具或装备,使得它们的属性值之和等于某个目标值(例如合成高级装备的条件)。
应用:通过该算法,可以快速判断玩家是否满足合成条件,并提示玩家如何组合道具。
- 数据分析:查找特定关系
场景:在数据分析中,可能需要找到两个数据点,使得它们的值之和等于某个目标值(例如查找两个用户的消费总额等于某个特定值)。
应用:通过该算法,可以快速筛选出符合条件的数据对,用于进一步分析。
- 密码学:哈希碰撞检测
场景:在密码学中,可能需要找到两个输入,使得它们的哈希值之和等于某个目标值(例如检测哈希碰撞)。
应用:通过该算法,可以快速检测是否存在哈希碰撞,提高密码系统的安全性。
- 物流与调度:资源分配
场景:在物流或资源调度中,可能需要找到两个任务或资源,使得它们的成本或时间之和等于某个目标值。
应用:通过该算法,可以快速找到最优的资源分配方案,提高效率。
- 推荐系统:个性化推荐
场景:在推荐系统中,可能需要找到两个商品或内容,使得它们的评分或权重之和等于某个目标值。
应用:通过该算法,可以为用户推荐更符合其偏好的内容组合。
- 数学问题:方程求解
场景:在数学问题中,可能需要找到两个数,使得它们的和等于某个目标值(例如求解方程
x
y
t
a
r
g
e
t
x+y=target)。
应用:通过该算法,可以快速求解这类简单的数学问题。
- 实时系统:事件匹配
场景:在实时系统中,可能需要找到两个事件,使得它们的属性值之和等于某个目标值(例如匹配两个传感器的读数)。
应用:通过该算法,可以快速匹配事件,触发相应的操作。
- 社交网络:好友推荐
场景:在社交网络中,可能需要找到两个用户,使得他们的某些属性值之和等于某个目标值(例如兴趣评分之和)。
应用:通过该算法,可以为用户推荐更合适的好友或群组。
1.2 最长无重复字符子串(Longest Substring Without Repeating Characters)
问题描述:给定一个字符串,找出不含有重复字符的最长子串的长度。
输入:s = "abcabcbb"
输出:3("abc")
解法:滑动窗口 + 哈希表,时间复杂度为 O(n)。
2. 链表
2.1 反转链表(Reverse Linked List)
问题描述:反转一个单链表。
示例:
输入:1 -> 2 -> 3 -> 4 -> 5
输出:5 -> 4 -> 3 -> 2 -> 1
解法:迭代或递归实现。
2.2 检测链表是否有环(Linked List Cycle)
问题描述:判断链表中是否有环。
示例:
java
复制
输入:1 -> 2 -> 3 -> 4 -> 2(形成环)
输出:true
解法:快慢指针(Floyd判圈算法),时间复杂度为 O(n)。
- 树与图
3.1 二叉树的最大深度(Maximum Depth of Binary Tree)
问题描述:计算二叉树的最大深度。
示例:
输入:
3
/
9 20
/
15 7
输出:3
解法:递归或层序遍历(BFS)。
3.2 二叉树的最近公共祖先(Lowest Common Ancestor of a Binary Tree)
问题描述:找到二叉树中两个节点的最近公共祖先。
示例:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解法:递归或路径记录法。
- 动态规划
4.1 最长递增子序列(Longest Increasing Subsequence)
问题描述:给定一个整数数组,找到最长递增子序列的长度。
示例:
输入:nums = [10, 9, 2, 5, 3, 7, 101, 18]
输出:4([2, 3, 7, 101])
解法:动态规划或二分查找优化,时间复杂度为 O(n log n)。
4.2 零钱兑换(Coin Change)
问题描述:给定不同面额的硬币和一个总金额,计算凑成总金额所需的最少硬币数。
示例:
输入:coins = [1, 2, 5], amount = 11
输出:3(5 + 5 + 1)
解法:动态规划,时间复杂度为 O(n * m),其中 n 是金额,m 是硬币种类数。
public static int coinChange(int[] coins, int amount) {// 初始化 dp 数组int[] dp = new int[amount + 1];Arrays.fill(dp, amount + 1); // 初始化为无穷大dp[0] = 0; // 金额为 0 时不需要硬币// 动态规划填充 dp 数组for (int i = 1; i <= amount; i++) {for (int coin : coins) {if (coin <= i) {dp[i] = Math.min(dp[i], dp[i - coin] + 1);}}}// 返回结果return dp[amount] > amount ? -1 : dp[amount];
}
- 回溯与搜索
5.1 全排列(Permutations)
问题描述:给定一个不含重复数字的数组,返回所有可能的全排列。
示例:
java
复制
输入:nums = [1, 2, 3]
输出:[[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]
解法:回溯算法。
5.2 组合总和(Combination Sum)
问题描述:给定一个无重复元素的数组和一个目标数,找出数组中所有可以使数字和为目标的组合。
示例:
输入:candidates = [2, 3, 6, 7], target = 7
输出:[[2, 2, 3], [7]]
解法:回溯算法。
- 堆与优先队列
6.1 数组中的第K个最大元素(Kth Largest Element in an Array)
问题描述:在未排序的数组中找到第 k 个最大的元素。
示例:
java
复制
输入:nums = [3, 2, 1, 5, 6, 4], k = 2
输出:5
解法:快速选择算法或最小堆,时间复杂度为 O(n) 或 O(n log k)。
- 其他经典问题
7.1 LRU缓存(LRU Cache)
问题描述:设计并实现一个 LRU(最近最少使用)缓存机制。
解法:哈希表 + 双向链表。
7.2 接雨水(Trapping Rain Water)
问题描述:给定 n 个非负整数表示高度图,计算按此排列的柱子能接多少雨水。
示例:
java
复制
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解法:双指针或动态规划。
总结
以上问题涵盖了数组、字符串、链表、树、动态规划、回溯、堆等常见算法和数据结构。在准备面试时,建议: