337. House Robber III
The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
还是House Robber,这次从数组变成了二叉树,类似的,也是不能选择相邻的2个节点。由于是树状结构,需要使用递归方法,对每个节点保存2个值包含此节点的最大和,以及不包含此节点的最大和res[1]以及res[0]。对root,root的res[1]等于root->left的res[0]+root->right的res[0]+root的值。而res[0]则等于root->left的max(res[0],res[1]) + root->的max(res[0],res[1])。代码如下:int rob(TreeNode* root) {
vector<int> res = dfs(root);
return max(res[0], res[1]);
}
vector<int> dfs(TreeNode *root) {
if (!root) return vector<int>(2, 0);
vector<int> left = dfs(root->left);
vector<int> right = dfs(root->right);
vector<int> res(2, 0);
res[0] = max(left[0], left[1]) + max(right[0], right[1]);
res[1] = left[0] + right[0] + root->val;
return res;
}
377. Combination Sum IV
Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.
题意为给出一组正整数与一个目标正整数,求出所有可能的数组中的正整数组合成目标的组合数。依然可以使用动态规划,转移方程中需要加入目标减去数组中每个数的状态。即dp[i]=Σdp[i-nums[k]]。设数组中整数数目为m,目标大小为n,这样的话复杂度会是O(mn)。
最终代码如下:
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target + 1);
dp[0] = 1;
for (int i = 1; i <= target; ++i) {
for (int j=0;j<nums.size();j++) {
if (i >= nums[j]) dp[i] += dp[i - nums[j]];
}
}
return dp.back();
}
};