📣 独立日限时特惠: VIP通行证立减$68
查看: 2440| 回复: 13
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] Leetcode第15题如果要求不能先把array排序

全局:

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

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

x
Leetcode 第15题, 给一个无序数组,求所有三个元素加起来等于0的集合,先给正常解法
  1. public List<List<Integer>> threeSum(int[] nums) {
  2.         Arrays.sort(nums);
  3.         List<List<Integer>> res = new ArrayList<>();
  4.         
  5.         for(int i = 0; i < nums.length - 2; i++) {
  6.             if(i > 0 && nums[i] == nums[i - 1]) continue;
  7.             int sum = 0 - nums[i];
  8.             int low = i + 1;
  9.             int high = nums.length - 1;
  10.             while(low < high) {
  11.                 if(nums[low] + nums[high] == sum) {
  12.                     res.add(Arrays.asList(nums[i], nums[low], nums[high]));
  13.                     while(low < high && nums[low + 1] == nums[low]) low++;
  14.                     while(low < high && nums[high - 1] == nums[high]) high--;
  15.                     low++;
  16.                     high--;
  17.                 } else if(nums[low] + nums[high] < sum) {
  18.                     low++;
  19.                 } else {
  20.                     high--;
  21.                 }
  22.             }
  23.         }
  24.         
  25.         return res;
  26.     }
复制代码



然后被问到如果不允许使用arrays.sort。。。该怎么解,我真的大大的脑袋。。。搜了很多答案都没有找到符合要求的,求高手提示一下啊啊啊, 加米加米


上一篇:刷了650/1515,python,好累,想放棄
下一篇:感觉上次面试被面试官带沟里去了
全局:
本帖最后由 ztj108 于 2020-7-15 06:48 编辑

确实可以不用排序,而且排序也确实非必须,对比下2sum不需排序就达到了O(N),而3sum必须排序才能达到O(N^2)就不符合了逻辑。
3sum的排序意义是,把不排序的两个O(N^2 + N^2)的操作变成O(NlogN + N^2)
不排序的算法很简单,就如一楼说的HashMap,去重有多种方法基础算法也不难。
简单来说 1. Map<Integer, List<int[]>> map = new HashMap<>();保存<2sum, List<int[]{index0,index1}>>
再设一个 Set<String> set查重
2. 两个loop算2sum和对应i,j加入map, 可以inner loop 从i+1算起,这样就保证i<j只用算一半
        for(int i = 0; i < len; i++)
            for(int j = i + 1; j < len; j++)
3. 然后新开for(int k = 0; k< n; k++)找到if(map.containsKey(-nums[k]))
取出list里每个int[], 如果k和i或j相等说明一个数用了第二次肯定不对,就continue // index查重
i,j,k不等的话分别取出nums[i],nums[j],nums[k]
4. 查重方式有很多,简单的比如三个数排序,然后加逗号间隔变成String放set里查重 "-3,1,2" //value查重
set已经有的话就continue,没有的话String加入set保存,三个数就是正确结果放到resultList


这样的时间复杂度也是O(N^2),但就如一开始说的两个操作是O(N^2 + N^2)所以会比排序O(NlogN + N^2)要慢

评分

参与人数 2大米 +6 收起 理由
14417335 + 5
fish1994 + 1 赞一个!

查看全部评分

回复

使用道具 举报

推荐
Mr.Brain 2020-7-16 21:39:25 | 只看该作者
全局:
本帖最后由 Mr.Brain 于 2020-7-16 21:41 编辑

首先,two sum是leetcode第一题,是最简单的题,简化了很多corn case,比如保证没有重复,只有一组解,而且由于只是2sum,所以hashmap的做法只是个特例。正常的做法就是先sort后双指针。如果是3sum,你还能试着在two sum用用hashmap,自己利用set去重,那么 对于4sum,5sum。Ksum, 这么做就很费劲了,也没有任何优势。而对于Ksum,排序后递归到2sum是正常做法。
回复

使用道具 举报

全局:
感觉可以选一个点,再对其他的用HashMap求2sum?不过难点在于去重吧。

评分

参与人数 2大米 +2 收起 理由
14417335 + 1
fish1994 + 1 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
pennyhwung 2020-7-15 01:00:42 | 只看该作者
全局:
不知道小帅 发表于 2020-7-14 15:51
感觉可以选一个点,再对其他的用HashMap求2sum?不过难点在于去重吧。

先放set里去重呢?然后在2 sum

评分

参与人数 1大米 +1 收起 理由
fish1994 + 1 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
Wu_kong 2020-7-15 01:56:53 | 只看该作者
全局:
他说不许用array sort, 你自己写一个sort func 不可以吗

评分

参与人数 1大米 +1 收起 理由
fish1994 + 1 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
 楼主| fish1994 2020-7-15 02:15:49 | 只看该作者
全局:
Wu_kong 发表于 2020-7-15 01:56
他说不许用array sort, 你自己写一个sort func 不可以吗

我感觉他的意思是好像如果不让排序的话?
回复

使用道具 举报

🔗
conghao2016 2020-7-15 14:24:29 | 只看该作者
全局:
比twosum就是多了最外圈一层loop,转为two sum变种即可? 难点确实是去重,可以采用anagrams,对一组三个数字排序【1,2,-3】---> [-3,1,2] 然后把这个list加入set中.

评分

参与人数 1大米 +1 收起 理由
fish1994 + 1 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
BobbyBear 2020-7-15 21:39:00 | 只看该作者
全局:
conghao2016 发表于 2020-7-15 14:24
比twosum就是多了最外圈一层loop,转为two sum变种即可? 难点确实是去重,可以采用anagrams,对一组三个数 ...

没错,2sum并不依赖于sort。

评分

参与人数 1大米 +1 收起 理由
fish1994 + 1 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
xiaocaicai 2020-7-16 01:15:52 | 只看该作者
全局:
个人观点 排序的一个好处就就是不用考虑/容易去重 本身并没有在时间复杂度上帮助到算法

评分

参与人数 1大米 +1 收起 理由
fish1994 + 1 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
conghao2016 2020-7-16 12:15:36 | 只看该作者
全局:
BobbyBear 发表于 2020-7-15 21:39
没错,2sum并不依赖于sort。

缘分啊 一起刷题不
回复

使用道具 举报

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

本版积分规则

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