给定一个列表和一个整数,设计算法找到两个数的下标,使得两个数之和为给定的整数。保证肯定仅有一个结果。
- 例如,列表
[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)