leetcode-163周赛-1262-可被3整除的最大和

题目描述:

 

 

 

 方法一:动态规划 O(N)

class Solution:
    def maxSumDivThree(self, nums: List[int]) -> int:
        dp = [0, -1,-1]
        for n in nums:
            tmp = dp[:]
            for i in range(3):
                if dp[i] != -1:
                    tmp[(i+n)%3] = max(tmp[(i+n)%3], dp[i]+n)
            dp = tmp
        return dp[0]

方法二:暴力 O(nlogn)

class Solution:
    def maxSumDivThree(self, nums: List[int]) -> int:
        n1, n2 = [], [] 
        ans = 0
        for num in nums:
            if num % 3 == 0:
                ans += num
            elif num % 3 == 1:
                n1.append(num)
                ans += num
            else:
                n2.append(num)
                ans += num
        n1.sort(reverse=True)
        n2.sort(reverse=True)
        
        if len(n1) % 3 == len(n2) % 3:
            return ans
        
        if len(n1) % 3 > len(n2) % 3:
            n1, n2 = n2, n1
        
        if len(n1) % 3 == 0 and len(n2) % 3 == 1:
            if not n1: return ans - n2[-1]
            return ans - min(n2[-1], n1[-1] + n1[-2])
        if len(n1) % 3 == 0 and len(n2) % 3 == 2:
            if not n1: return ans - n2[-1] - n2[-2]
            return ans - min(n1[-1], n2[-1] + n2[-2])
        if len(n1) % 3 == 1 and len(n2) % 3 == 2:
            if len(n1) == 1: return ans - n2[-1]
            return ans - min(n2[-1], n1[-1] + n1[-2])

 

posted @ 2019-11-20 21:26  oldby  阅读(300)  评论(0编辑  收藏  举报