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])