思路:暴力求解肯定没意思,所以我在这里用了个简单的二分法求解。就是去剩下的数组里面去寻找符合解的数。
其实这就是一个类似查找算法,只要确定一个,就可以通过查找另一个进行求解。
网上有hashmap的java代码
'''
问题描述:在一组数中找到两个数的和等于某个数,要求时间复杂度小于0(n^2)
'''
#想法:二分查找法
class Solution:
def dichotomy(self,nums,target:int):
low = 0
high = len(nums)-1
while(low<=high):
if(nums[int((low+high)/2)] < target):
low = int((low+high)/2) + 1
elif(nums[int((low+high)/2)] > target):
high = int((low + high) / 2) - 1
else:
return int((low + high) / 2)
return -1
def twoSum(self,nums,target):
numbers = sorted(nums) #排序之后的数组才能进行二分法
flag = 0;
List = []
for i in range(0,len(numbers)):
if(numbers[i]>(target/2)): #如果此时的数已经大于目标数的一半,那就说明不可能有解
break
else:
j = self.dichotomy(numbers,target-numbers[i])
if((j != -1) & (j!=i) ):
x = [x for x,y in enumerate(nums) if y==numbers[i]]
x = x[0]
#x = nums.index(numbers[i])
y = [y for y, b in enumerate(nums) if b == numbers[j]]
#y = nums.index(numbers[j])
if (len(y) > 1):
y = y[1]
else:
y = y[0]
flag = 1
if(flag == 1):
List.append(x)
List.append(y)
return List
else:
return List
nums = [2,7,11,15]
target = 9
x = Solution().twoSum(nums,target)
if(x == []):
print("无解")
else:
print(x)