【劍指offer41、42】和爲S的兩個連續序列、兩個數

【劍指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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章