求1+2+……+n

题目描述

image

思路

逻辑运算短路

本题难点在于各种限制

不能用乘除导致了不能用等差数列求和的公式

不能用循环导致了不能用迭代

不能用判断导致了递归无法常规终止

但是我们可以用逻辑运算符的短路来实现这一点,即用之替代if

代码实现

class Solution {
    public int sumNums(int n) {
        boolean x=n>1&&(n+=sumNums(n-1))>0;
        return n;
    }
}

复杂度分析

时间复杂度

O(N)

空间复杂度

O(N)

反思不足

思路

发现三个思路都不行后就卡壳了,不知道往什么方向思考了

二叉搜索树的最近公共祖先

题目描述

image
image

思路

二叉搜索树的性质

本题关键是利用二叉搜搜索树的性质,以及对情况的分类讨论,而后可以用迭代和递归实现

代码实现

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)

反思不足

思路

熟悉二叉树搜索的性质,总满足左小于根小于右

二叉树的最近公共祖先

题目描述

image
image

思路

递归+自下而上

代码实现

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,并且我们是一遇到节点中的某一个就直接返回的,所以对应的节点直接就是最近公共节点