leetcode337. House Robber III

1398 단어 leetcode
제목: 두 갈래 나무에 대해 어떤 분지 위의 두 노드를 동시에 취하여 얻을 수 있는 가장 큰 값을 구할 수 없다.(이것은 제목의 대의이다)
사고방식: 두 갈래 나무에 대해 조건에 따라 이 두 갈래 나무 뿌리 노드가 취할 수 있다고 판단하면 매개 변수true를 전달하고 만약에 어떤 두 갈래 나무의 뿌리 노드가 취할 수 없다면false를 전달한다. 매개 변수가true일 때 도대체 두 가지 상황으로 나눌 수 있는지 없는지는 0-1가방 문제와 유사하다. 그리고 그 결과가 비교적 큰 상황으로 돌아간다.매개 변수가false이면 루트 노드를 찾을 수 없을 것입니다. (root.left,true) + (root.right,true) 로 돌아갑니다.
나는 순전히 귀속적으로 쓴 것으로 효율이 비교적 낮을 수 있다.leetcode에 제출하면 시간이 1000ms를 넘지만 사고가 상대적으로 간단하다.
내 leetcode의 모든 코드는 github에 넣었습니다.https://github.com/gaohongbin/leetcode
코드:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
   public int rob(TreeNode root) {
         if(root == null)
			 return 0;
		 
		 return helper(root,true);
    }
    
    public int helper(TreeNode root,boolean flag){ //flag true root ,flag false root 
		 if(root == null)
			 return 0;
		 
		 if(flag == false){ // root 
			 int left = helper(root.left,true);
			 int right = helper(root.right,true);
			 
			 return left+right;
		 }
		 else{  //root 
			 int hasRoot = root.val + helper(root.left,false)+helper(root.right,false); // root 
			 int noRoot = helper(root.left,true)+helper(root.right,true);// root 
			 if(hasRoot>noRoot)
				 return hasRoot;
			 return noRoot;
		 }
	 }
}

좋은 웹페이지 즐겨찾기