求1+2+……+n
题目描述

思路
逻辑运算短路
本题难点在于各种限制
不能用乘除导致了不能用等差数列求和的公式
不能用循环导致了不能用迭代
不能用判断导致了递归无法常规终止
但是我们可以用逻辑运算符的短路来实现这一点,即用之替代if
代码实现
class Solution {
public int sumNums(int n) {
boolean x=n>1&&(n+=sumNums(n-1))>0;
return n;
}
}
复杂度分析
时间复杂度
O(N)
空间复杂度
O(N)
反思不足
思路
发现三个思路都不行后就卡壳了,不知道往什么方向思考了
二叉搜索树的最近公共祖先
题目描述


思路
二叉搜索树的性质
本题关键是利用二叉搜搜索树的性质,以及对情况的分类讨论,而后可以用迭代和递归实现
代码实现
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root!=null){
if(root.val<p.val&&root.val<q.val){
root=root.right;
}else if(root.val>p.val&&root.val>q.val){
root=root.left;
}else{
break;
}
}
return root;
}
}
复杂度分析
时间复杂度
O(N)
空间复杂度
O(1)
反思不足
思路
熟悉二叉树搜索的性质,总满足左小于根小于右
二叉树的最近公共祖先
题目描述


思路
递归+自下而上
代码实现
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null||root==p||root==q){
return root;
}
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
if(left==null){
return right;
}
if(right==null){
return left;
}
return root;
}
}
复杂度分析
时间复杂度
O(N)
空间复杂度
O(N)
反思不足
思路
自下而上想到了
想不通应该怎么辨别出两个节点是否在某个节点的异侧,可以这样想,如果同侧的话,必定有一侧越过叶子节点,返回值为null,并且我们是一遇到节点中的某一个就直接返回的,所以对应的节点直接就是最近公共节点