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

[Leetcode] 第416题,不小心写出了一个14ms的超快解法,但自己都不知道到底对不对,求挑错!!!

全局:

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

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

x




class Solution {
    public boolean canPartition(int[] nums) {
        Arrays.sort(nums);
        List<Integer> list1=new ArrayList<>();
        List<Integer> list2=new ArrayList<>();
        int sum1=0;
        int sum2=0;
        for(int i=0;i<nums.length;i++){
            if(i%2==0){
                list1.add(nums[i]);
                sum1+=nums[i];
            }else{
                list2.add(nums[i]);
                sum2+=nums[i];
            }
        }
        if((sum1+sum2)%2==1) return false;
        int sum=0;
        for(int i:nums){
            sum+=i;
            if(sum*2==sum1+sum2) return true;
        }
        while(sum1!=sum2){
            if(list1.isEmpty() || list2.isEmpty()) break;
            if(sum1>sum2){
                int diff=(sum1-sum2)/2;
                int index=0;
                for(int i=list1.size()-1;i>0;i--){
                    if(Math.abs(diff-list1.get(i))<=Math.abs(diff-list1.get(i-1))){
                        index=i;
                        break;
                    }
                }
                int item=list1.remove(index);
                sum1-=item;
                sum2+=item;
            }else{
                int diff=(sum2-sum1)/2;
                int index=0;
                for(int i=list2.size()-1;i>0;i--){
                    if(Math.abs(diff-list2.get(i))<=Math.abs(diff-list2.get(i-1))){
                        index=i;
                        break;
                    }
                }
                int item=list2.remove(index);
                sum1+=item;
                sum2-=item;
            }
        }
        return sum1==sum2;
    }
}





代码如上,希望大神帮帮忙,这个解法到底对不对?

上一篇:求解 Design Tiny URL
下一篇:利扣656的coin path为什么只能使用dp walk backward解决?
推荐
stellari 2017-8-23 08:27:05 | 只看该作者
全局:
这类Greedy解法在数字大小和数组长度差别不大时能得出比较好的近似结果,但是如果数字很大而数组比较短就很可能不行了,比如:{15, 48, 49, 69, 70, 71, 150}有解(48+49+69+70 == 15+71+150 == 236),但是这段代码返回的是false。

这种方法如果能保证给出正确解的话,你就等于已经证明了P=NP啦


评分

参与人数 1大米 +3 收起 理由
outlier_2017 + 3 大神请收下我的大米

查看全部评分

回复

使用道具 举报

🔗
2011051305 2017-8-23 05:50:48 | 只看该作者
全局:
。。。我一直以为这道题是背包问题?

评分

参与人数 1大米 +3 收起 理由
outlier_2017 + 3 给大神加个米

查看全部评分

回复

使用道具 举报

🔗
 楼主| outlier_2017 2017-8-23 05:56:08 | 只看该作者
全局:
2011051305 发表于 2017-8-23 05:50
。。。我一直以为这道题是背包问题?

我也看了backpack解法。
但这个到底对不对呢。。。
回复

使用道具 举报

🔗
keytion 2017-8-23 06:29:18 | 只看该作者
全局:
大概看懂了你的解法,基本就是先从一个还不错的 近似解开始,greedy的方式开始move element;

因为都是positive element, 于是都从 当前sum比较高的move 到比较低的; 同时因为,we can move each element at most once to achieve the optimal solution, if exists. Therefore we just need to remove it.

Cute idea, but I am not sure the greedy strategy for "removing" is correct, but it should be a very good strategy, that I cannot manually find any counter-examples..

Do you have a idea of proof in mind?
回复

使用道具 举报

🔗
2011051305 2017-8-23 06:54:10 | 只看该作者
全局:
本帖最后由 2011051305 于 2017-8-23 06:57 编辑
outlier_2017 发表于 2017-8-23 05:56
我也看了backpack解法。
但这个到底对不对呢。。。

我觉得是对的,你这个做法应该就是贪心的思路。每次去其中最大的k个elements(本题k=2)然后把这些elements塞到whichever smaller subsets里去。
用数学归纳法可以证明正确性

但是这个方法不是O(nlogn)的么? 动态规划应该是O(sum*n)的 (sum是input数字之和)所以说明利扣的test cases 应该都是 logn比sum小的?。。。(我好鸡贼。。)

内什么。。不是大神。。。大神是@fentoyal  他每次都救我于水火。。 我是已经毕业了没找到工作的弱鸡 == 顺便打滚求安慰。。
回复

使用道具 举报

🔗
staycrazy 2017-8-23 08:32:40 | 只看该作者
全局:
试一下这组测试数据:
[1, 5, 7, 23, 24]
回复

使用道具 举报

🔗
staycrazy 2017-8-23 08:33:31 | 只看该作者
全局:
stellari 发表于 2017-8-23 08:27
这类Greedy解法在数字大小和数组长度差别不大时能得出比较好的近似结果,但是如果数字很大而数组比较短就很 ...

是的,我刚才也构造了一组。

Leetcode的测试数据还是太弱了。
回复

使用道具 举报

🔗
 楼主| outlier_2017 2017-8-23 08:59:35 | 只看该作者
全局:
2011051305 发表于 2017-8-23 06:54
我觉得是对的,你这个做法应该就是贪心的思路。每次去其中最大的k个elements(本题k=2)然后把这些elemen ...

没事没事,亚麻保底好吧
回复

使用道具 举报

🔗
bearicc 2017-8-23 09:10:11 | 只看该作者
全局:
一看望去好复杂,感觉不适合面试这种高强度快节奏~
回复

使用道具 举报

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

本版积分规则

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