leetcode337. 打家劫舍 III
生活随笔
收集整理的這篇文章主要介紹了
leetcode337. 打家劫舍 III
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一:題目
二:上碼
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/ class Solution { public:/**思路:1.動(dòng)態(tài)規(guī)劃YYDS2.分析題意:既然是二叉樹 那么和他離不開的就是遍歷順序 深度遍歷和廣度遍歷 我們可以知道的是本題和父節(jié)點(diǎn)有關(guān)的,那么我們就不考慮廣度遍歷;我們是考慮子節(jié)點(diǎn)的狀態(tài)來考慮我們是否偷取父節(jié)點(diǎn);所以我們采用后序遍歷。3.用到遞歸1>:確定遞歸函數(shù)與參數(shù)我們采取兩個(gè)狀態(tài)來記錄我們是否偷取 0 表示不偷; 1 表示偷;vector<int> sumMoney(TreeNode* root)2>:確定遞歸的終止條件當(dāng)我們遍歷到葉節(jié)點(diǎn)的時(shí)候 又往下遍歷了一次 那么我們的結(jié)點(diǎn)返回必定是不偷if(root == NULL) return {0,0}3>:確定遞歸的遞歸體vector<int> left = sumMoney(root->left);vector<int> right = sumMoney(root->right);那么我們的遞歸體就是為了表達(dá)當(dāng)前結(jié)點(diǎn)偷與不偷;如果我們偷當(dāng)前的結(jié)點(diǎn);那么我們的當(dāng)前已偷的總價(jià)值就是加上左右節(jié)不偷的價(jià)值int val1 = cur->val + left[0] + right[0];如果我們不偷當(dāng)前的結(jié)點(diǎn);那么我們現(xiàn)在的總價(jià)值就是就是左右結(jié)點(diǎn)中偷與不偷中價(jià)值的最大價(jià)值int val2 = max(left[0],left[1]]) + max(right[0],right[1])**/int rob(TreeNode* root) {vector<int> ans;ans = sumMoney(root);return max(ans[0],ans[1]);}vector<int> sumMoney(TreeNode* root) {if(root == NULL) return {0,0};vector<int> left = sumMoney(root->left);vector<int> right = sumMoney(root->right);int val1 = root->val + left[0] + right[0];//偷int val2 = max(left[0],left[1]) + max(right[0],right[1]);//不偷return {val2,val1};//注意這里的順序我們是 {不偷,偷} 因?yàn)槲覀兊南聵?biāo)安排的是0 1 下標(biāo)就是不偷與偷} };
天天向上 加油
總結(jié)
以上是生活随笔為你收集整理的leetcode337. 打家劫舍 III的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 太阳穴填充的方法
- 下一篇: leetcoed123. 买卖股票的最佳