欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode:410. 分割数组的最大值(困难,二分,dp)--------二分的前期判断还是要好好想,可能有细微的错误。

程序员文章站 2022-03-16 11:22:39
...

题目:

leetcode:410. 分割数组的最大值(困难,二分,dp)--------二分的前期判断还是要好好想,可能有细微的错误。

分析:

菜呀,还是太菜,
最大值最小,这么敏感的二分提示字眼,自己的大脑竟然都没有察觉。

代码:道路曲折到怀疑模板,再重申一遍,模板是不容置疑的,有问题也是出在判断的过程上。:

class Solution {
public:
    int splitArray(vector<int>& nums, int m) {
        /*
        nums.clear();
        nums.push_back();
        nums.push_back(4);
        nums.push_back(4);
        m=3;
        */
        long long a=nums[0];
        for(int i=0;i<nums.size();i++)
        {
            a=max(a,(long long)nums[i]);
        }        
        long long  b=accumulate(nums.begin(),nums.end(),0);
        //sort(nums.begin(),nums.end());
        while(a<=b)
        {
            long long c=a+(b-a)/2;//最多存放的数的和
            long long all=1;
            long long sum=0;
            for(int i=0;i<nums.size();i++)
            {
                sum+=nums[i];
                if(sum>c)
                {
                    sum=nums[i];
                    all++;
                }
            }
            //cout<<c<<' ';
            if(all<=m)
            {
                b=c-1;
            }

            else{
                a=c+1;
            }
        }
        return a;
    }
};

1.第一次,下界判断错误,比如说,这样的一个例子:

leetcode:410. 分割数组的最大值(困难,二分,dp)--------二分的前期判断还是要好好想,可能有细微的错误。
如果:

for(int i=0;i<nums.size();i++)
            {
                sum+=nums[i];
                if(sum>c)
                {
                    sum=nums[i];
                    all++;
                }
            }

还是这样的判断,那么1是可以满足的,因为一旦sum大于当前允许的最大容量,就会加1,即默认一定能放下一个,所以最小值边界应该设置为所有元素的最大值。

2.第二次,上界设置的太小了。

3.第三次,原来是只能相邻的分割啊,如果可以不相邻,显然问题会复杂的很多,不是简单的一个排序就可以解决的了。