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

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