美文网首页
41、和为s的两个数字VS和为s的连续正数序列

41、和为s的两个数字VS和为s的连续正数序列

作者: 小碧小琳 | 来源:发表于2018-10-05 21:41 被阅读0次

和为s的两个数字

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

代码实现:

# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        #题目没有对于特殊情况的输入做解释,那么也就先满足基本功能吧
        length = len(array)
        p1 = 0
        p2 = length - 1
        while p1 < p2:
            #若有答案,则返回答案
            if array[p1] + array[p2] == tsum:
                return array[p1],array[p2]
            elif array[p1] + array[p2] < tsum:
                p1 += 1
            else:
                p2 -= 1

        #若运行至此,说明没有答案,因此返回空列表
        return []

和为s的连续正数序列

参考上面的做法,我们可以令small=1,big=2,然后sum小于target,就增大small的值,大于target就减小big的值。
那么既然有多个结果,什么时候停止呢?
注意到,是连续的正数序列,并且最小只能有两个数。那么small就应该在(1+target)//2处停止。比如,对于15来说,当small到8时,最少也是8+9等于17了。因此,当small等于middle时,就可以终止了。

注意的地方:
不知道指针small和big指针怎么操作的话,可以举例子,比如15,走一遍就知道了。
初始化small 为1,big为2,curSum为1+2=3

  • 当curSum比tarSum小时,应该向右移动big指针。
  • 当curSum比tarSum大时,应该向左移动small指针。
  • 当curSum等于tarSum时,此时应该输出从small到big的序列。
    但是需要注意的是,此时我们仍然想要找别的解,那么怎么移动呢?经过写的例子,很容易推出,此时应该向右移动big指针,去推动循环的继续实现。

代码实现:

# -*- coding:utf-8 -*-
class Solution:
    def outList(self,small,big):
        out = []
        for i in range(small,big+1):
            out.append(i)
        return out

    def FindContinuousSequence(self, tsum):
        if tsum < 3:
            return []

        small = 1
        big = 2
        middle = (1+tsum)//2
        curSum = small + big
        res = []

        while small < middle:
            if curSum < tsum:
                big += 1
                curSum += big

            elif curSum >  tsum:
                curSum -= small
                small += 1

            else:
                out = self.outList(small,big)
                res.append(out)
                big += 1
                curSum += big
        return res

S = Solution()
print(S.FindContinuousSequence(15))

相关文章

  • 剑指offer|41-50题解题思路及代码(Java版)

    剑指offer41到50题总览: 和为S的连续正数序列 和为S的两个数字 左旋转字符串 反转单词顺序列 扑克牌顺子...

  • Java日记2018-05-20

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

  • 11-15题

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

  • 和为s的连续整数序列

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

  • 41、和为s的两个数字VS和为s的连续正数序列

    和为s的两个数字 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和...

  • 面试题57_2:和为S的连续正数序列

    和为s的连续正数序列 输入一个正数s,打印出所有何为s的连续正数序列(至少含有两个数)。 例如输入15,由于1+2...

  • 4.7 双指针问题(1)

    方法 暂无 注意点 暂无 目录 和为S的连续正数序列(很经典) 和为S的连续正数序列 小明很喜欢数学,有一天他在做...

  • 【剑指Offer 41】和为s 的连续正数序列

    题目:输入一个正数s,打印出所有和为s 的连续正数序列(至少两个数)。 代码如下: 来源:http://blog....

  • 和为S的连续正数序列

    题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不...

  • 和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并...

网友评论

      本文标题:41、和为s的两个数字VS和为s的连续正数序列

      本文链接:https://www.haomeiwen.com/subject/oqpqaftx.html