《剑指offer》 57 和为S的数字

本文介绍如何解决《剑指offer》中关于寻找和为S的数字问题。针对题目一,通过遍历排序数组并计算差值来找到配对;对于题目二,采用双指针法,一个从数组开头,一个从结尾开始,根据和与S的大小关系移动指针;题目三是寻找和为S的连续正数序列,按照书中的解法可能在某些平台出现错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目一:

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

先遍历每个元素,在做差,看看差值在不在里面,因为数组是排序过的,所以乘积较小的肯定就是离得最远的,、python 的话还是很方便的

# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        if len(array) == 0:
            return []
        num = 0
        for i in array:
            num += 1
            another = tsum - i
            if another in array:
                return i,another
        if num == len(array):
            return [] 

题目一:和为S的2个数字

输入一个递增的数组和一个数字,在数组中查找2个数字,是他们的和正好为S,如果有多对的和为S,则输出任意一对即可

思路:2个指针,一个队首,一个队尾,当2个数字之和大于s,就把大的向前移,当2个数字之和小于s,就把小的向后移,

class Solution:
    def sumrm(self, L,s):
        if L == [] or L is None:
            return None
        i,j = 0,len(L)-1
        while i < j:
            sumn = L[i] + L[j]
            if sumn < s:
                i +=1
            elif sumn > s:
                j = j - 1
            else:
                return L[i],L[j]

题目三:和为S的连续正数序列

输入一个正数s,打印出所有和为s的连续正数序列(至少包含2个数)

解法:按照书上的思路写的代码,在平台上运行出错,不清楚为什么,在自己的IDE上就可以。。。代码如下

# -*- coding:utf-8 -*-
class Solution:
    def FindContinuousSequence(self, tsum):
        # write code here
        if tsum < 3:
            return []
        small = 1
        big = 2
        middle = (1 + tsum)//2
        curSum = small + big
        while small < middle:
            if curSum == tsum:
                self.printsequence(small, big, tsum)
            while curSum > tsum and small < middle:
                curSum = curSum - small
                small += 1
                if curSum == tsum:
                    self.printsequence(small, big, tsum)
            big = big + 1
            curSum = curSum + big
    def printsequence(self, small, big, tsum):
        L = []
        for i in range(tsum):
            L.append(i)
        print (L[small:big+1])


c = Solution()
c.FindContinuousSequence(9)
牛客上大佬的解法思路也是这样,其中输出直接用列表生成,而不是我的for循环完成,是这里的问题吗?不清楚测试代码。。。
# -*- coding:utf-8 -*-
class Solution:
    def FindContinuousSequence(self, tsum):
        # write code here
        if tsum < 3:
            return []
        small = 1
        big = 2
        middle = (tsum + 1)>>1
        curSum = small + big
        output = []
        while small < middle:
            if curSum == tsum:
                output.append(range(small, big+1))
                big += 1
                curSum += big
            elif curSum > tsum:
                curSum -= small
                small += 1
            else:
                big += 1
                curSum += big
        return output



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值