0
点赞
收藏
分享

微信扫一扫

剑指offer57 和为s的数字


题干:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一堆即可。

例如:输入【1,2,4,7,11,15】和数字15,由于4+11=15,因此输出4和11

解体思路:

最简单暴力的解决办法是两个for循环,先在数组中固定一个数字,再一次判断数组中其余的n-1个数字和它的和是不是等于s,不过是件复杂度是O(n^2),更优的解法是利用数组是递增这个条件,先将数字第一个和最后一个作为两个数,如果和大于要查找的sum值,那么将最后那个最大值下标减1,再继续判断,如果和小于sum,那么将第一个最小值下标加1,再继续判断,时间复杂度O(n)

list = [1, 2, 4, 7, 11, 15]
k = 15
class Solution(object):
def search(self, nums):
global k;
low = 0
high = len(nums) - 1
sum = nums[low] + nums[high]
count = 0
while(low < high):
count += 1
sum = nums[low] + nums[high]
if sum == k:
print('找到和为%d的两个元素啦 下标%d值%d和下标%d值%d' % (k, low, nums[low], high, nums[high]))
break
elif sum > k:
high = high - 1
print('第%d轮查询 sum > k 小数%d 大数%d 和%d' % (count, low, high, sum))
else:
low += 1
print('第%d轮查询 sum < k 小数%d 大数%d 和%d' % (count, low, high, sum))


solu = Solution()
solu.search(list)

输出:

第1轮查询 sum > k 小数0 大数4 和16
第2轮查询 sum < k 小数1 大数4 和12
第3轮查询 sum < k 小数2 大数4 和13
找到和为15的两个元素啦 下标2值4和下标4值11

举报

相关推荐

0 条评论