337. House Robber III+198. House Robber

House RobberIII

对二叉树的各种操作还不太熟....一开始是自己写的程序,然而逻辑有些问题,居然认为必须隔层访问(其实隔两层/三层也是可以的...所以重点是当前访问的结点是否被计入)。

参考了他人的代码,解题思路如下:针对正在访问的结点,两种情况取较大值,(1)当前结点值计入,则结果是左孩子和右孩子不计入时两个子树的count;(2)当前结点值不计入,则结果是左子树两种情况(计入/不计入)下的max加上右子树在两种情况下的max。

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
	int rob(TreeNode* root) {
	    if(root==nullptr) return 0;
            int sum1, sum2;
	    subRob(root, sum1,sum2);

	    return max(sum1,sum2);
	}

	void subRob(TreeNode* startNode, int &sum1, int &sum2){
	    if(startNode==nullptr) return;
		int leftSum1 = 0;
		int leftSum2 = 0;
		int rightSum1 = 0;
		int rightSum2 = 0;
		
		subRob(startNode->left, leftSum1, leftSum2);
		subRob(startNode->right, rightSum1, rightSum2);
		sum1 = startNode->val + leftSum2 + rightSum2;
		sum2 = max(leftSum1,leftSum2) + max(rightSum1,rightSum2);
	}
};

House RobberI

(更新)

给出一系列非负整数,不能同时取相邻两个元素,求解可能获得的最大累加和。

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size()==0) return 0;
        
        int isCount = nums[0];
        int notCount = 0;
        
        for(int i=1;i<nums.size();i++){
            int preIsCount = isCount;
            int preNotCount = notCount;
            isCount = preNotCount+nums[i];
            notCount = max(preNotCount,preIsCount);
        }
        
        return max(isCount,notCount);
    }
};


你可能感兴趣的:(LeetCode)