LC98. 验证二叉搜索树
//递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return ValidBST(Long.MIN_VALUE,Long.MAX_VALUE,root);
}
boolean ValidBST(long lower,long upper, TreeNode root){
if(root == null)
return true;
if(root.val <= lower|| root.val >= upper)
return false;
return ValidBST(lower,root.val,root.left) && ValidBST(root.val,upper,root.right);
}
}
//迭代,中序遍历
class Solution {
public boolean isValidBST(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<TreeNode>();
double inorder = -Double.MAX_VALUE;
while (!stack.isEmpty() || root != null) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
// 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
if (root.val <= inorder) {
return false;
}
inorder = root.val;
root = root.right;
}
return true;
}
}
LC718. 最长重复子数组
//和最长公共子序列题目类似也是通过一个二维的dp数组,然后求dp[m][n],正向遍历得到结果
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int[][] dp = new int[nums1.length + 1][nums2.length + 1];
int result = 0;
for(int i = 1;i <= nums1.length;i++){
for(int j = 1;j <= nums2.length;j++){
if(nums1[i - 1] == nums2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
result = Math.max(result,dp[i][j]);
}
}
return result;
}
}
LC78. 子集
//和排列问题类似也是需要一个变量值去控制整个循环过程当中,此时子集的变量值是传递到for循环由for循环控制,并且我们不管是排列组合还是子集问题我们都是要在递归出口进行一个res最终值得一个添加操作res.add(new ArrayList(path));取一个镜像值因为如果不这么操作的话path加进去得时候永远是remove以后剩下一个空得list
class Solution {
private LinkedList<Integer> path = new LinkedList();
private List<List<Integer>> res = new ArrayList();
public List<List<Integer>> subsets(int[] nums) {
if(nums.length == 0)
return res;
backtrace(nums,0);
return res;
}
public void backtrace(int[] nums,int idx){
res.add(new ArrayList(path));
for(int i = idx;i < nums.length;i++){
path.add(nums[i]);
//自己不重复,i+1
backtrace(nums,i + 1);
path.removeLast();
}
}
}