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