常见编码面试问题
问题: 编写一个布尔函数,接收一个整数数组和一个目标整数 k,判断数组中是否存在两个不同的元素,其和等于 k。
示例:
输入:array = [4, 5, 1, -3, 6], k = 11
输出:true
解释:5 + 6 = 11
输入:array = [4, 5, 1, -3, 6], k = -2
输出:true
解释:1 + (-3) = -2
输入:array = [4, 5, 1, -3, 6], k = 8
输出:false
解释:不存在两个数的和等于 8
解决方案
方法 1:暴力破解法
思路: 使用双重循环遍历数组中的每一对元素,检查它们的和是否等于目标值 k。
外层循环选择第一个数 arr[i]
内层循环遍历剩余的数 arr[j](j > i),检查 arr[i] + arr[j] == k
时间复杂度: O(n²)(适用于小规模数组)
空间复杂度: O(1)
适用场景: 代码简单,易于理解 适用于数据量较小的情况
方法 2:优化方法(使用哈希集合)
思路: 利用哈希集合存储已遍历的元素,对于当前元素 num,检查集合中是否存在 k - num:
初始化一个空集合 seen
遍历数组中的每个元素 num:
计算补数 complement = k - num
如果 complement 存在于 seen 中,说明找到符合条件的数对,返回 true
否则,将 num 加入 seen
遍历结束后仍未找到,则返回 false
时间复杂度: O(n)(只需一次遍历)
空间复杂度: O(n)(需要额外存储集合)
优势:
高效,适用于大规模数据 避免不必要的重复计算