和為s的兩個數字
輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,如果有多對數字的和等于S,輸出兩個數的乘積最小的。
代碼實現:
# -*- coding:utf-8 -*-
class Solution:
def FindNumbersWithSum(self, array, tsum):
#題目沒有對于特殊情況的輸入做解釋,那么也就先滿足基本功能吧
length = len(array)
p1 = 0
p2 = length - 1
while p1 < p2:
#若有答案,則返回答案
if array[p1] + array[p2] == tsum:
return array[p1],array[p2]
elif array[p1] + array[p2] < tsum:
p1 += 1
else:
p2 -= 1
#若運行至此,說明沒有答案,因此返回空列表
return []
和為s的連續正數序列
參考上面的做法,我們可以令small=1,big=2,然后sum小于target,就增大small的值,大于target就減小big的值。
那么既然有多個結果,什么時候停止呢?
注意到,是連續的正數序列,并且最小只能有兩個數。那么small就應該在(1+target)//2處停止。比如,對于15來說,當small到8時,最少也是8+9等于17了。因此,當small等于middle時,就可以終止了。
注意的地方:
不知道指針small和big指針怎么操作的話,可以舉例子,比如15,走一遍就知道了。
初始化small 為1,big為2,curSum為1+2=3
- 當curSum比tarSum小時,應該向右移動big指針。
- 當curSum比tarSum大時,應該向左移動small指針。
- 當curSum等于tarSum時,此時應該輸出從small到big的序列。
但是需要注意的是,此時我們仍然想要找別的解,那么怎么移動呢?經過寫的例子,很容易推出,此時應該向右移動big指針,去推動循環的繼續實現。
代碼實現:
# -*- coding:utf-8 -*-
class Solution:
def outList(self,small,big):
out = []
for i in range(small,big+1):
out.append(i)
return out
def FindContinuousSequence(self, tsum):
if tsum < 3:
return []
small = 1
big = 2
middle = (1+tsum)//2
curSum = small + big
res = []
while small < middle:
if curSum < tsum:
big += 1
curSum += big
elif curSum > tsum:
curSum -= small
small += 1
else:
out = self.outList(small,big)
res.append(out)
big += 1
curSum += big
return res
S = Solution()
print(S.FindContinuousSequence(15))