查看: 2306| 回复: 13
跳转到指定楼层
上一主题 下一主题
收起左侧

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

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
如果数组中有重复的元素,返回所有unique的数字组合。例如[1, 2, 2, 3, 3, 4, 4, 5], target = 6, 返回:[[1, 5], [2, 4], [3, 3]].

这道题用hash map有同学可解吗?是在想不到办法了,大概有思路但是写不出😭
小弟只能献上大米了!求答案


评分

参与人数 3大米 +7 收起 理由
timzyt + 3 给你点个赞!
liszt + 1 赞一个
14417335 + 3

查看全部评分


上一篇:计算机网络的 88 个核心概念
下一篇:text justification 带行号
全局:
就是原题hash答案的set 改map吧,map value里存这数是不是在答案里出现过。
回复

使用道具 举报

推荐
twtypsj 2021-7-8 05:03:52 | 只看该作者
全局:
这样写?

  1. /******************************************************************************

  2.                               Online C++ Compiler.
  3.                Code, Compile, Run and Debug C++ program online.
  4. Write your code in this editor and press "Run" button to compile and execute it.

  5. *******************************************************************************/

  6. #include <iostream>
  7. #include <vector>
  8. #include <map>
  9. using namespace std;
  10. vector<vector<int>> twoSum(vector<int> nums, int target)
  11. {
  12.     map<int,int> m;
  13.     for(int i : nums) m[i]++;
  14.     vector<pair<int,int>> data(m.begin(), m.end());
  15.     vector<vector<int>> res;
  16.     int i=0; int j=data.size()-1;
  17.     while(i<=j)
  18.     {
  19.         if(data[i].first+data[j].first==target)
  20.         {
  21.             if(data[i].first != data[j].first || data[i].second>1) res.push_back({data[i].first, data[j].first});
  22.             i++;j--;
  23.         }
  24.         else if(data[i].first+data[j].first < target) i++;
  25.         else j--;
  26.     }
  27.     return res;
  28. }
  29. int main()
  30. {
  31.     for(auto& i : twoSum({1,2,2,3,3,4,4,5}, 6)) cout << i[0] << " " << i[1] << endl;

  32.     return 0;
  33. }
复制代码



回复

使用道具 举报

推荐
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))
复制代码
回复

使用道具 举报

全局:
双指针 然后移动指针的时候调到下一个不一样的数字
回复

使用道具 举报

🔗
 楼主| data12345 2021-7-2 15:07:36 | 只看该作者
全局:
yyt913 发表于 2021-7-2 15:04
双指针 然后移动指针的时候调到下一个不一样的数字

就是想找arry sort以外的解法谢谢~
回复

使用道具 举报

全局:
two sum返回的是数的index吧,不是数字本身?
回复

使用道具 举报

🔗
wisdompeak2 2021-7-2 16:26:37 | 只看该作者
全局:
先将每个元素都存入集合。遍历每个unique元素x,看看target-x是不是在集合里。是的话,就是一种pair。
当然,还有很多细节,类似于3+3这种情况,要保证元素3至少出现了两次。
回复

使用道具 举报

全局:
data12345 发表于 2021-07-02 00:07:36
就是想找arry sort以外的解法谢谢~
哦哦 我还有个idea就是你每次找到一个组合就把他变成小数在前大数在后的string…然后再用set dedup…如果不在set里就说明是新的…
回复

使用道具 举报

全局:
用set就能解决为啥用map
回复

使用道具 举报

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

本版积分规则

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