【劍指offer41】
題目描述
用例
輸入 | 輸出 |
---|---|
1 | [] |
2 | [] |
3 | [1,2] |
4 | [] |
5 | [2,3] |
6 | [1,2,3] |
7 | [3,4] |
8 | [] |
9 | [1,2,3,4] [4,5] |
10 | [1,2,3,4] |
100 | [9,10,11,12,13,14,15,16] [18,19,20,21,22] |
解題思路
雙指針法:相當於有一個窗口,指針在窗口兩邊,根據窗口內的值之和來確定窗口的位置和寬度。
j必須永遠大於i,如果i+j的值小於tsum,則j後移,使i+j的值增大;如果i+j的值大於tsum,則i後移,使i+j的值減小;當tsum=i+j,i繼續後移,看是否有其他的連續序列。
此題由於是連續正序列,則求和公式可用差值爲1的等差序列求和公式:(a0+an)*n/2
python代碼
class Solution:
def FindContinuousSequence(self, tsum):
# write code here
if tsum <= 1:
return []
res = []
i = 1
j = 2
while j > i:
cur = ((i + j)*(j - i + 1)) / 2
if cur == tsum:
res.append(list(range(i, j + 1)))
i += 1
elif cur < tsum:
j += 1
elif cur > tsum:
i += 1
return res
s = Solution()
print(s.FindContinuousSequence(9))
【劍指offer42】
題目描述
用例
輸入 | 輸出 |
---|---|
[1,2,4,7,11,15] 15 | [4,11] |
[1,2,4,7,11,15] 10 | [] |
解題思路
雙指針法:
i指向第一個數,j指向最後一個數,如果i+j的值小於tsum,則i後移;如果i+j的值大於tsum,則j前移。
python代碼
# -*- coding:utf-8 -*-
class Solution:
def FindNumbersWithSum(self, array, tsum):
# write code here
i = 0
j = len(array)-1
res = []
while i < j:
cur = array[i]+array[j]
if cur == tsum:
res.append(array[i])
res.append(array[j])
return res
elif cur < tsum:
i += 1
elif cur > tsum:
j -= 1
return res
s = Solution()
result = s.FindNumbersWithSum([1,2,4,7,11,16],10)
print(result)