计算机面试题–求和问题
1、 两数求和
该题时间复杂度为O(n)
"""
1:nums为一组数组
2:目标值target
3:找出数组中和为目标值的两个整数,返回下标
"""
def two_sum(nums, target):
dict_ret = {}
for i, n in enumerate(nums): # 遍历nums,组合为索引序列
# i为下标,n为实际的数字
if n in dict_ret:
return [dict_ret[n], i] # 返回[字典[等于当期数值的key],当前数值的下标]
dict_ret[target - n] = i # {期望得到的数值:目前数值下标}
return []
nums = [2, 3, 5, 0, 1]
target = 6
obj = two_sum(nums, target)
2、两数求和–升序数组
该题解题方法的时间复杂度为O(n)
"""
1、nums为一组按升序排序的有序序列
2、target为目标值
3、找到两个下标使对应的值之和等于目标值
4、假定每种输入只有个答案,且每个数值只能用一次
"""
def sum_sort(nums, target):
i, j = 0, len(nums)-1
while i < j:
ret = nums[i] + nums[j]
if ret == target:
return [i, j]
elif ret > target:
j -= 1
elif ret < target:
i += 1
return []
nums = [0, 1, 2, 4, 5]
target = 3
obj = sum_sort(nums, target)
print(obj)
3、三数求和
时间复杂度为O(n^2)
"""
1、nums是一个包含N个整数的数组
2、nums中存在三个元素A、B、C,且A+B+C=0
3、找出所有满足条件二且不重复的三元组
"""
def three_sum(nums):
nums.sort()
ret = []
i = 0
while i < len(nums) - 2:
target = -nums[i] # target为另外两个数的和
# 此处变成求两位数相加等于目标值target
h = {}
j = i + 1
while j < len(nums):
current = nums[j] # 根据下标得到的第二位实际数值
if current in h: # 判断得到的数是否在h的key中
ret.append([nums[i], h[current], nums[j]])
else:
h[target - current] = current # h中存储的数{第三位数的实际值:第二位数的实际值}
j = skip_dup(j, nums)
i = skip_dup(i, nums)
return ret
def skip_dup(i, nums):
"""下个数于当前数值相同则跳过"""
n = i + 1
while n < len(nums) and nums[n] == nums[i]:
n = n + 1
return n
nums = [-1, 0, 1, 2, -1, -4]
obj = three_sum(nums)
print(obj)
4、四数求和
"""
1、nums是一个包含N个整数的数组
2、nums中存在四个元素A、B、C、D,且A+B+C+D等于目标数值target
3、找出所有满足条件二且不重复的四元组
"""
def four_sum(nums, target):
nums.sort()
ret = []
i = 0
while i < len(nums) - 3:
j = len(nums) - 1
while j > i:
# 求三数之和
k, l = i + 1, j - 1
remain = target - (nums[i] + nums[j])
while k < l:
s = nums[k] + nums[l]
if s == remain:
ret.append([nums[i], nums[j], nums[k], nums[l]])
k, l = move(k, nums, 1), move(l, nums, -1)
elif s > remain:
l = move(l, nums, -1)
else:
k = move(k, nums, 1)
j = move(j, nums, -1)
i = move(i, nums, 1)
return ret
def move(i, nums, nun):
n = i + nun
while n < len(nums) and nums[n] == nums[i]:
n = n + nun
return n
nums = [1, 0, -1, 0, -2, 2]
target = 0
obj = four_sum(nums, target)
print(obj)
转载:文献参考《高效制胜-程序员面试典型题解》吴江编著