python leetcode 410. Split Array Largest Sum
阿新 • • 發佈:2018-12-01
程式碼一:DP
難點在於如何設定dp陣列
dp[i][j] 前j個數字分成i組所能得到的最小的各個子陣列中最大值
程式碼二:二分查詢變種
class Solution(object): def splitArray(self, nums, m): """ :type nums: List[int] :type m: int :rtype: int """ #dp[i][j] 前j個數字分成i組所能得到的最小的各個子陣列中最大值 n=len(nums) sums=[0]*(n+1) dp=[[float('inf')]*(n+1) for _ in range(m+1)] dp[0][0]=0 for __ in range(1,n+1): sums[__]=sums[__-1]+nums[__-1] dp[1][__]=sums[__] for i in range(2,m+1): for j in range(1,n+1): for k in range(i-1,j):#不需要從0開始 因為已經分割了i-1次即如果分割後每個陣列只有一個元素的話也有i-1個數組 val=max(dp[i-1][k],sums[j]-sums[k])#開闢出的新的子陣列和是sum[j]-sum[k] 與之前的進行比較 dp[i][j]=min(dp[i][j],val) return dp[m][n]
class Solution: def splitArray(self, nums, m): """ :type nums: List[int] :type m: int :rtype: int """ left=max(nums) right=sum(nums) while left < right: mid=left+(right-left)//2 if self.canSplit(nums,m,mid): right = mid else: left=mid+1 return left def canSplit(self,nums,m,sum1): cnt=1 curSum=0 for i in range(len(nums)): curSum+=nums[i] if curSum>sum1: curSum=nums[i] cnt+=1 if cnt>m: return False return True