题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
方法来自:https://blog.youkuaiyun.com/fuxuemingzhu/article/details/79698467
代码:
# -*- coding:utf-8 -*-
class Solution:
def FindContinuousSequence(self, tsum):
# write code here
if tsum==1:
return []
small = 1
big = 2
mid = tsum//2
cursum = small + big
result = []
while small <=mid:
if cursum == tsum:
result.append(range(small,big+1))
big +=1
cursum +=big
elif cursum < tsum:
big +=1
cursum += big
else:
cursum -=small
small += 1
return result
和为S的两个数字
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
# -*- coding:utf-8 -*-
class Solution:
def FindNumbersWithSum(self, array, tsum):
# write code here
# 用两个头尾指针,值大了,尾指针减一,值小了,头指针加一
# 如果相等头指针加一,尾指针减一
# 头尾指针相等时停止
head = 0
tail = len(array) -1
result = []
while head<=tail:
cursum = array[head]+ array[tail]
if cursum == tsum :
result.append([array[head],array[tail]])
head +=1
tail -=1
elif cursum > tsum:
tail -=1
else:
head +=1
if len(result)==1:
return result[0]
elif len(result)==0:
return []
else:
curmpl = result[0][0]*result[0][1]
tem = result[0]
for each in result:
if curmpl > each[0]*each[1]:
tem.pop(0)
tem.extend(each)
curmpl = each[0]*each[1]
return tem
由于输出乘积最小的:
例子
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],21
相加为21的组合[[1, 20], [2, 19], [3, 18], [4, 17], [5, 16], [6, 15], [7, 14], [8, 13], [9, 12], [10, 11]]
从结果可以看出第一个就是最小的,所以找到第一对组合就可以返回,他们满足乘积最小。
程序可以继续优化:
参考牛客的答案
# -*- coding:utf-8 -*-
class Solution:
def FindNumbersWithSum(self, array, tsum):
if not array:
return []
length = len(array)
i, j = 0, length-1
while i <= j:
temp = array[i] + array[j]
if temp == tsum:
return [array[i], array[j]]
elif temp > tsum:
j -= 1
elif temp < tsum:
i += 1
return []