拼多多笔试,第二题,leetcode能A,笔试时死活60%

 class Solution {
   //.火柴正方形 leetcode 473
    public boolean makesquare(int[] nums) {
         if (nums == null || nums.length<4) return false;
         int count = 0;
         for (int x:nums)
             count+=x;
         if (count%4 !=0) return false;

         int len = count/4;
         int k = 4; //.划分成4个等和子集
        Arrays.sort(nums);
       if (nums[nums.length-1]>len) return false;
       int beginIndex = nums.length-1;
       while (beginIndex>=0 && len == nums[beginIndex]){
           k--;
           beginIndex--;
       }
       int[] bucket = new int[k];

       return rec(nums,bucket,beginIndex,k,len);
    }

    private boolean rec(int[] nums,int[] bucket,int beginIndex,int k,int target){
        if (beginIndex<0)
            return true;

        int putnum = nums[beginIndex];

        for (int i =0;i<k;i++){
            if (putnum+bucket[i]<=target){
                bucket[i] += putnum;
                if (rec(nums,bucket,beginIndex-1,k,target)){
                    return true;
                }
                bucket[i] = bucket[i] - putnum;
                 if (bucket[i] == 0) break;
            }
        }
        return false;
    }
}

#拼多多笔试##拼多多##笔试题目#
全部评论
大佬,我也想到回溯了,但是一直不知道咋弄。你第三题过了多少呀,感觉不能遍历去计算,是用通项公式么?
点赞
送花
回复
分享
发布于 2020-05-06 16:14
剪枝剪枝剪枝!!!
点赞
送花
回复
分享
发布于 2020-05-06 16:19
滴滴
校招火热招聘中
官网直投
我是,从大到小逆序回溯可以过90,正序回溯过60,直观也比较好理解,先搞定长的棍子,小的棍子最后也好凑
点赞
送花
回复
分享
发布于 2020-05-06 16:46
突然又想到拼多多的题,我的思路跟楼主是一样的,前面也已经进行了sum%4和元素大于sum/4的剪枝操作,后边就是从最长的开始DFS+回溯,LeetCode能过,考试死活60%,楼主现在找到什么好的解法了吗
点赞
送花
回复
分享
发布于 2020-05-09 11:34

相关推荐

1 3 评论
分享
牛客网
牛客企业服务