Leetcode 653.兩數之和IV Java&Python
阿新 • • 發佈:2018-11-22
給定一個二叉搜尋樹和一個目標結果,如果 BST 中存在兩個元素且它們的和等於給定的目標結果,則返回 true。
案例 1:
輸入: 5 / \ 3 6 / \ \ 2 4 7 Target = 9 輸出: True
案例 2:
輸入: 5 / \ 3 6 / \ \ 2 4 7 Target = 28 輸出: False
凡是題目給出的是二叉搜尋樹而不是二叉樹的時候,一定要以二叉搜尋樹的性質為切入點,這道題目就用到了二叉搜尋樹中序遍歷的結果為有序陣列的性質。得到有序陣列後,做過 167號問題兩數之和II的同學會發現題目驚人的一致,採用對撞指標的方式便可高效的得到答案,演算法時間複雜度為O(n)。
Java
private List<Integer> list = new ArrayList<>(); public boolean findTarget(TreeNode root, int k) { if (root == null) { return false; } inOrder(root); int i = 0; int j = list.size() - 1; while (i < j) { int sum = list.get(i) + list.get(j); if (sum == k) { return true; } else if (sum < k) { i++; } else { j--; } } return false; } private void inOrder(TreeNode node) { if (node == null) { return; } inOrder(node.left); list.add(node.val); inOrder(node.right); }
Python
list = [] def findTarget(self, root, k): """ :type root: TreeNode :type k: int :rtype: bool """ if root is None: return False self.inOrder(root) i = 0 j = len(self.list) - 1 while i < j: sum = self.list[i] + self.list[j] if sum == k: return True elif sum < k: i += 1 else: j -= 1 return False def inOrder(self, node): if node is None: return self.inOrder(node.left) self.list.append(node.val) self.inOrder(node.right)