import numpy as np
class Solution:
def twoSum(self, nums, target):
# 因为只需要找唯一解, 找到一个可以直接返回, 而且元素不重复
d = {}
ans = []
for i in range(len(nums)):
tmp = target - nums[i]
if tmp in d.keys():
return [d[tmp], i]
if nums[i] not in d.keys():
d[nums[i]] = i
return ans
def twoSum2(self, nums, target):
'''
前提是排序之后的数组, 不然2指针无法奏效
假设我们要找到全部的解, 而且不能重复(这一点导致后面添加了很多代码)
:param i 指向第一个元素
:param j 指向最后一个有效的元素
:param nums:
:param target:
:return: 有效的下标数组 [[]]
'''
i, j = 0, len(nums) - 1
ans = []
# 为了保证不重复, 不能让i 等于 j
while i < j:
if nums[i] + nums[j] < target:
i += 1
elif nums[i] + nums[j] > target:
j -= 1
else:
ans.append([i, j])
# 越界判断, 首先要保证nums[i]后面的元素是存在的, 不然你怎么往后比较?
while i + 1 < j and nums[i] == nums[i + 1]:
i += 1
# 执行到此, 有两种情况
# 一种是由于 i + 1 == j 也就是说要碰面了, 这时候 nums[i] 是等于nums[i+1]的,
# 这种情况就比较特殊, i+1 要继续执行,而且后边的j -= 1 也是正常执行,导致 i > j的 循环终止
# 一种是nums[i] != nums[i+1], 这也就是说这是连续相等的元素的最后一个了(而且我们之前已经用过了
# ), 下一次我们要重新找一个, 所以还要 + 1 移动到下一个位置
i += 1
while j - 1 > i and nums[j] == nums[j - 1]:
j -= 1
j -= 1
return ans
def twoSum3(self, nums, target):
'''
如果继续改条件, 给你的数组未经过排序, 而返回值仍然要的是下标, 而且是不允许重复的
:param nums:
:param target:
:return:
'''
# 用词典记录下标的值 存在覆盖问题, 但是这个不影响我们的答案
d = {}
print(nums)
for i in range(len(nums)):
if nums[i] not in d.keys():
d[nums[i]] = i
print(d)
nums.sort()
print(nums)
i, j = 0, len(nums) - 1
ans = []
# 为了保证不重复, 不能让i 等于 j
while i < j:
if nums[i] + nums[j] < target:
i += 1
elif nums[i] + nums[j] > target:
j -= 1
else:
ans.append([d[nums[i]], d[nums[j]]])
# 越界判断, 首先要保证nums[i]后面的元素是存在的, 不然你怎么往后比较?
while i + 1 < j and nums[i] == nums[i + 1]:
i += 1
# 执行到此, 有两种情况
# 一种是由于 i + 1 == j 也就是说要碰面了, 这时候 nums[i] 是等于nums[i+1]的,
# 这种情况就比较特殊, i+1 要继续执行,而且后边的j -= 1 也是正常执行,导致 i > j的 循环终止
# 一种是nums[i] != nums[i+1], 这也就是说这是连续相等的元素的最后一个了(而且我们之前已经用过了
# ), 下一次我们要重新找一个, 所以还要 + 1 移动到下一个位置
i += 1
while j - 1 > i and nums[j] == nums[j - 1]:
j -= 1
j -= 1
return ans
if __name__ == '__main__':
sol = Solution()
nums = [2, 5, 7, 7, 11, 11, 13, 15]
# shuffle 没有返回值
# np.random.shuffle(nums)
# print(nums)
nums3 = [5, 11, 13, 11, 15, 2,7, 7,]
res = sol.twoSum3(nums3, 18)
print(res)
leetcode1 two_sum
猜你喜欢
转载自blog.csdn.net/weixin_36149892/article/details/80461139
今日推荐
周排行