剑指 Offer 57. 和为s的两个数字

剑指 Offer 57. 和为s的两个数字https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/

首先暴力肯定就是遍历每个数

第一种方法双指针: 

i,j=0,len(nums)-1

如果,num[i]+num[j]>target

执行j=j-1,这时候(i+1,j)指nums[i+1]+nums[j],(i+1,j),(i+2,j),...,(j-1,j)会丢失,以后,再也没有这些值

因为列表是递增的,num[i]+num[j]>target,那么这些丢失的也大于target,所以丢失没影响,这些值本来也不满足

如果,num[i]+num[j]<target

执行i=i+1,这时候(i,j-1),(i,j-2),..(i,i+1)会丢失,同样的这些丢失的值的和也小于target,

所以丢失没影响,这些值本来也不满足

二分法就是对每个数,二分去找后面的数和它求和

'''
#超时
class Solution:
    def twoSum(self, nums, target):
        for i in range(len(nums)):
            if nums[i]>=target:
                break
            for j in range(i+1,len(nums)):
                if nums[i]+nums[j]==target:
                    return [nums[i],nums[j]]
                if nums[i]+nums[j]>target:
                    break
'''
'''
双指针
class Solution:
    def twoSum(self, nums, target):
        i,j=0,len(nums)-1
        while i<j:
            if nums[i]+nums[j]>target:
                j-=1
            elif nums[i]+nums[j]<target:
                i+=1
            else:
                return [nums[i],nums[j]]
'''
class Solution:
    def twoSum(self, nums, target):
        for i in range(len(nums)):
            left=i+1
            right=len(nums)-1
            while left<=right:
                mid=(left+right)//2
                if nums[mid]+nums[i]>target:
                    right=mid-1#写成mid超时
                elif nums[mid]+nums[i]<target:
                    left=mid+1#写成mid超时
                else:
                    return [nums[i],nums[mid]]

a=Solution()
nums = [2,7,11,15]
target = 9
print(a.twoSum(nums,9))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值