[LeetCode ] Python-410. 分割数组的最大值

琐碎记录 专栏收录该内容
40 篇文章 0 订阅

给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。

注意:
数组长度 n 满足以下条件:

1 ≤ n ≤ 1000
1 ≤ m ≤ min(50, n)
示例:

输入:
nums = [7,2,5,10,8]
m = 2

输出:
18

解释:
一共有四种方法将nums分割为2个子数组。
其中最好的方式是将其分为[7,2,5] 和 [10,8],
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。
思路:

按照七月在线的算法教程不行呀:
在这里插入图片描述
在这里插入图片描述
辛辛苦苦按照他这个来,结果得不到正确的结果(有大神可以帮我看看么?):

class Solution:
    def guess(self,mid,nums,m):
        # if m buckets can hold when sum is not bigger than mid
        buckets = 0
        sum_sub = 0 
        for num in nums:
            sum_sub = sum_sub + num
            if sum_sub > mid:
                # exceed mid, declear a new buckets
                buckets = buckets + 1
                sum_sub = num

        return buckets <= m

    def splitArray(self, nums: List[int], m: int) -> int:
        L = max(nums)
        R = sum(nums)
        # for i in nums:
        #     R += i
        # mid \in [0, sumall]
        ans = 0
        while L<R:
            mid = (L+R)//2.
            print(mid)
            if self.guess(mid,nums,m):# max sum is mid, m is enough smaller
                # print('guess right, mid can be larger')
                ans = mid
                L = mid + 1
            else:# guess err, need larger mid (m is not enough for a given mid, )
                # print('guess err, mid can be smaller')
                R = mid
        return int(ans)
 

按照网络上其他大神给出的解:

class Solution(object):
    def splitArray(self, nums, m):
        """
        :type nums: List[int]
        :type m: int
        :rtype: int
        """
        # max(nums), sum(nums)
        if len(nums) == m:
            return max(nums)
        lo, hi = max(nums), sum(nums)
        while(lo < hi):
            mid = (lo + hi) // 2 # 最大和
            
            #------以下在模拟划分子数组的过程
            temp, cnt = 0, 1
            for num in nums:
                temp += num
                # cnt += 1
                if temp > mid:#说明当前这个子数组的和已经超过了允许的最大值mid,需要把当前元素放在下一个子数组里
                    temp = num
                    cnt += 1
            # print temp, cnt, mid
            #------以上在模拟划分子数组的过程
            
            if cnt > m: #说明分出了比要求多的子数组,多切了几刀,说明mid应该加大,这样能使子数组的个数减少
                lo = mid + 1
            elif cnt <= m:
                hi = mid
 
                
        return lo

核心不同可能就是这个return这里,返回的竟然是lo!

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值