python2.7
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
思路:
定义两个指针small=1,big=2,S的值为9,改变small和big的值
思路:
维持最小变量small, 最大变量 big. 如果small + big == target, small向前移动一位,big向后移动一位
如果small + big > target, 则要缩小和, big向前移动。否则, small向前移动增大和
回到本问题
同样有small, big. 初始值为1, 2。target为N
序列和(small到big) > target,同样要缩小和, small向前移动一位,则序列和减小small。否则增大和,big向前移动一位,序列和增大big
如果相同,则保存下来。
如此循环直到 small >= (1 + target) /2, 因为此时big + small 肯定大于target(题目要求最少两位)
#coding:utf-8
def find_continuous_s(n):
if n < 3:
return []
small = 1
big = 2
middle = (n+1)/2
sum_val = small+big
result = []
while small < middle:
if sum_val == n:
result.append(list(range(small,big+1)))
big += 1
sum_val += big
elif sum_val > n:
sum_val -= small
small += 1
else:
big += 1
sum_val += big
return result
print(find_continuous_s(9))
面向对象
class Solution:
def FindContinuousSequence(self, tsum):
if tsum < 3:
return []
self.small = 1
self.big = 2
self.mid = tsum/2+1
self.sum = self.small+self.big
self.result = []
while self.small < self.mid:
if self.sum == tsum:
self.result.append(range(self.small,self.big+1))
self.big += 1
self.sum += self.big
elif self.sum > tsum:
self.sum -= self.small
self.small += 1
else:
self.big += 1
self.sum += self.big
return self.result
if __name__ == '__main__':
s = Solution()
print(s.FindContinuousSequence(9))