12
返回列表 发新帖
楼主: data12345
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] two sum变形题挑战一下吧皮卡丘

🔗
timzyt 2021-8-1 13:39:38 | 只看该作者
全局:
本帖最后由 timzyt 于 2021-7-31 22:52 编辑
  1. def twoSumUniq(arr, target):
  2.   import collections
  3.   dic = collections.defaultdict(int)
  4.   ans = []
  5.   for n in arr:
  6.     if n not in dic:
  7.       # if n does not exist in dic before
  8.       # we just treat it as normal 2-sum
  9.       if target - n in dic:
  10.         ans.append([n, target - n])
  11.     elif dic[n] == 1:
  12.       # if n exists once in dic, and we meet n again
  13.       # we consider 2*n == target situation
  14.       if n * 2 == target:
  15.         ans.append([n, n])
  16.     dic[n] += 1
  17.   return ans
复制代码

可以定义一个hashtable: <number, freq of the number in array>
然后扫描数组,分类讨论2种情况。
1. n之前不存在hashtable中,这是最简单的情况,就把它当作普通2-sum来做
2. n存在hashtable中一次,这是corner case:考虑2n=target的情况
3. n存在hashtable中多次,这种情况跳过,因为再计算就重复了!

楼主可以看看这道类似的题目!https://www.lintcode.com/problem/587/

欢迎讨论!

回复

使用道具 举报

🔗
ewajwtewg 2021-8-1 14:44:38 | 只看该作者
全局:
  1. class Solution:
  2.     def twoSum(nums, target):
  3.         l, r = 0, len(nums)-1
  4.         ans = []
  5.         while l < r:
  6.             if nums[l] + nums[r] < target:
  7.                 l += 1
  8.             elif nums[l] + nums[r] > target:
  9.                 r -= 1
  10.             else:
  11.                 ans.append([nums[l],nums[r]])
  12.                 repeat = nums[l]
  13.                 while nums[l] == repeat:
  14.                     l += 1
  15.                 repeat = nums[r]
  16.                 while nums[r] == repeat:
  17.                     r -= 1
  18.         return ans

  19.     nums = [1, 2, 2, 3, 3, 4, 4, 5]
  20.     target = 6
  21.     print(twoSum(nums,target))
复制代码
回复

使用道具 举报

🔗
ewajwtewg 2021-8-1 14:45:50 | 只看该作者
全局:
  1. class Solution:
  2.     def twoSum(nums, target):
  3.         l, r = 0, len(nums)-1
  4.         ans = []
  5.         while l < r:
  6.             if nums[l] + nums[r] < target:
  7.                 l += 1
  8.             elif nums[l] + nums[r] > target:
  9.                 r -= 1
  10.             else:
  11.                 ans.append([nums[l],nums[r]])
  12.                 repeat = nums[l]
  13.                 while nums[l] == repeat:
  14.                     l += 1
  15.                 repeat = nums[r]
  16.                 while nums[r] == repeat:
  17.                     r -= 1
  18.         return ans

  19.     nums = [1, 2, 2, 3, 3, 4, 4, 5]
  20.     target = 6
  21.     print(twoSum(nums,target))
复制代码
回复

使用道具 举报

🔗
kkrrt 2021-8-3 02:15:17 | 只看该作者
全局:
hashmap-  key 存 num里的数字  value 存频率, 然后按普通2 sum来做。 找到一组之后就把用了的数字从hashmap里移调。  当遇到  target-n == n的时候判断一下n 的频率是否是大于等于2的 只有大于等于2才说明nums里有足够的数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表