小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為s的連續正數序列? good luck!
輸出所有和為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 :
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
和為S的連續正數序列(python)
和為s的連續正數序列 使用滑動視窗來求解這道題,核心思想就是設定乙個大小不固定的視窗來圈住目標列表,如果列表中的資料滿足條件就新增到答案中,否則就動態的移動該滑動視窗。coding utf 8 class solution def findcontinuoussequence self,tsum 使...
和為S的連續正數序列
題目描述 小明很喜歡數學,有一天他在做數學作業時,要求計算出9 16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100 至少包括兩個數 沒多久,他就得到另一組連續正數和為100的序列 18,19,20,21,22。現在把問題交給你,你能不能也很快的...
和為S的連續正數序列
小明很喜歡數學,有一天他在做數學作業時,要求計算出9 16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100 至少包括兩個數 沒多久,他就得到另一組連續正數和為100的序列 18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和...