给定一个列表和一个整数,设计算法找到两个数的下标,使得两个数之和为给定的整数。保证肯定仅有一个结果。

给定一个列表和一个整数,设计算法找到两个数的下标,使得两个数之和为给定的整数。保证肯定仅有一个结果。

  • 例如,列表[1, 2, 5, 4]与目标整数3,1+2=3,结果为(0,1)
    ##暴力解法,LEETCODE会超时
    class Solution:
        def twoSum(self,nums,target):
            """
            :param nums: list[int]
            :param target: int
            :return: list[int]
            """
            n=len(nums)
            for i in range(n):
                for j in range(n):
                    if i!=j:
                        if nums[i]+nums[j]==target:
                            return sorted([i,j])
    obj1=Solution()
    nums=[2,7,11,15]
    target=9
    # res=[]
    res=obj1.twoSum(nums,target)
    print(res)
    第二种解法
    让i跟(前面)后面的比
    class Solution:
        def twoSum(self,nums,target):
            """
            :param nums: list[int]
            :param target: int
            :return: list[int]
            """
            n=len(nums)
            for i in range(n):
                for j in range(i):#跟前面比 ,跟后面比 for j in range(i+1,n):
                    if i!=j:
                        if nums[i]+nums[j]==target:
                            return sorted([i,j])
    obj1=Solution()
    nums=[2,7,11,15]
    target=9
    # res=[]
    res=obj1.twoSum(nums,target)
    print(res)
    
    第三种解法  根据一个数字找另一个数字 查找一个数字 Index   时间复杂度更快二分查找 查找有序
    列表li有序使用二分查找
    class Solution:
        def binary_search(self,li,left,right,val):
            while left<=right:#候选区有值
                mid=(left+right)//2
                if li[mid]==val:
                    return mid
                elif li[mid]>val:#带查找的值在左侧
                    right=mid-1
                else:#li[mid]<val待查找的值在mid右侧
                    left=mid+1
            else:
                return None
    
        def twoSum(self,nums,target):
            """
            :param nums: list[int]
            :param target: int
            :return: list[int]
            """
            for i in range(len(nums)):
                a=nums[i]
                b=target-a
                if b>=a:
                    j=self.binary_search(nums,i+1,len(nums)-1,b)
                else:
                    j=self.binary_search(nums,0,i-1,b)
                if j:
                    break
            return sorted([i+1,j+1])
    #li无序的时候
    class Solution:
        def binary_search(self,li,left,right,val):
            while left<=right:#候选区有值
                mid=(left+right)//2
                if li[mid][0]==val:
                    return mid
                elif li[mid][0]>val:#带查找的值在左侧
                    right=mid-1
                else:#li[mid]<val待查找的值在mid右侧
                    left=mid+1
            else:
                return None
    
        def twoSum(self,nums,target):
            """
            :param nums: list[int]
            :param target: int
            :return: list[int]
            """
            #新建二维列表 每一列2个数 ;每一行2个数,第一个数字num,第二个数字i
            new_nums=[[num,i] for i,num in enumerate(nums)]
            #二维排序,按照指定的key排序,按照数进行排序 x[0]
            new_nums.sort(key=lambda x:x[0])
            # new_nums[i] 第i个列表
            # new_nums[i][0] new_nums[i][1] 第一个列表
            for i in range(len(new_nums)):
                a=new_nums[i][0]
                b=target-a
                if b>=a:
                    j=self.binary_search(new_nums,i+1,len(new_nums)-1,b)
                else:
                    j=self.binary_search(new_nums,0,i-1,b)
                if j:
                    break
            return sorted([new_nums[i][1],new_nums[j][1]])
    
    
    obj1=Solution()
    nums=[2,7,11,15]
    target=9
    res=[]
    res=obj1.twoSum(nums,target)
    print(res)
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落雪snowflake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值