python 和为S的连续正数序列

题目描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输出描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

方法来自:https://blog.csdn.net/fuxuemingzhu/article/details/79698467

这里写图片描述

代码:

# -*- coding:utf-8 -*-
class Solution:
    def FindContinuousSequence(self, tsum):
        # write code here
        if tsum==1:
            return []
        small = 1
        big = 2
        mid = tsum//2
        cursum = small + big
        result = []
        while small <=mid:
            if cursum == tsum:
                result.append(range(small,big+1))
                big +=1
                cursum +=big
            elif cursum < tsum:
                big +=1
                cursum += big
            else:
                cursum -=small
                small += 1
        return result
                
                 
                

和为S的两个数字

题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输出描述:

对应每个测试案例,输出两个数,小的先输出。
# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        # 用两个头尾指针,值大了,尾指针减一,值小了,头指针加一
        # 如果相等头指针加一,尾指针减一
        # 头尾指针相等时停止
        head = 0
        tail = len(array) -1 
        result = []
        while head<=tail:
            cursum = array[head]+ array[tail]
            if cursum == tsum :
                result.append([array[head],array[tail]])
                head +=1
                tail -=1
            elif cursum > tsum:
                tail -=1
            else:
                head +=1
        if len(result)==1:
            return result[0]
        elif len(result)==0:
            return []
        else:
            curmpl = result[0][0]*result[0][1]
            tem = result[0]
            for each in result:
                if curmpl > each[0]*each[1]:
                    tem.pop(0)
                    tem.extend(each)
                    curmpl = each[0]*each[1]
            return tem
                    

由于输出乘积最小的:

例子

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],21

相加为21的组合[[1, 20], [2, 19], [3, 18], [4, 17], [5, 16], [6, 15], [7, 14], [8, 13], [9, 12], [10, 11]]

从结果可以看出第一个就是最小的,所以找到第一对组合就可以返回,他们满足乘积最小。

程序可以继续优化:

参考牛客的答案

# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        if not array:
            return []
        length = len(array)
        i, j = 0, length-1
        while i <= j:
            temp = array[i] + array[j]
            if temp == tsum:
                return [array[i], array[j]]
            elif temp > tsum:
                j -= 1
            elif temp < tsum:
                i += 1
        return []

猜你喜欢

转载自blog.csdn.net/ustbbsy/article/details/82192772