LeetCode-0311

322.零钱兑换

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [float('inf')]*(amount+1)
        dp[0] = 0
        for coin in coins:
            for x in range(coin,amount+1):
                dp[x] = min(dp[x],dp[x-coin]+1)
        return dp[amount] if dp[amount]!=float('inf') else -1

1013.将数组分成和相等的三个部分

python

# 求和 除以 3 遍历
class Solution:
    def canThreePartsEqualSum(self, A: List[int]) -> bool:
        if sum(A)%3 != 0:
            return False
        count = 0 #定义和为3子数组个数,等于3则满足要求
        ans = sum(A)//3
        subsum = 0
        for i in range(len(A)):
            subsum +=A[i]
            if subsum == ans:
                count += 1
                subsum = 0
            if count == 3:
                return True
        return False
#双指针解法
# 从头尾开始遍历,如何和等于sum/3,中间部分一定也为3
class Solution:
    def canThreePartsEqualSum(self, A: List[int]) -> bool:
        if sum(A)%3 != 0:
            return False
        ans = sum(A)//3
        left,right = 0,len(A)-1
        leftsum,rightsum =A[left],A[right]
        while left+1 < right:
            if leftsum==ans and rightsum ==ans:
                return True
            if leftsum != ans:
                left += 1
            if rightsum != ans:
                right -= 1
        return False

c++

class Solution {
public:
    bool canThreePartsEqualSum(vector<int>& A) {
        int sum = accumulate(A.begin(), A.end(), 0);
        if(sum%3!=0){
            return false;
        }
        int count = 0,ans = sum/3,subsum = 0;
        for(int i=0;i<A.size();i++){
            subsum += A[i];
            if (subsum==ans){
                count+=1;
                subsum = 0;
                }
            if (count==3){
                return true;
            }
        }
        return false;
    }
};
原文地址:https://www.cnblogs.com/gongyanzh/p/12463539.html