0
点赞
收藏
分享

微信扫一扫

力扣Day19

yellowone 2022-01-31 阅读 40

231、2 的幂

 法一:2^x==n  如果n是2的幂次方  那么n一直除2最终就会整除变成1 (4/2/2=1) 就满足题目条件

其中要注意:n如果是奇数的话,除2也有可能变成1(7/2/2=1),所以要排除奇数的可能性,且要防止偶数除2变成奇数的可能。(6/2=3)

class Solution {
    public boolean isPowerOfTwo(int n) {
       if(n==1) return true;
       if(n<=0) return false;
       while(n>1){
           if (n%2 == 1) return false;//排除奇数
           n = n/2;
       }
       return true;
    }
}

法二:位运算

2的幂次方:n在二进制下,只有1位是1,其余全是0。而n-1&n就会全变成0

4:100 

3:011 

进行按位与后全变成0

class Solution {
    public boolean isPowerOfTwo(int n) {
       if(n==1) return true;
       if(n<=0) return false;
       return (n&(n-1))==0;
    }
}

法三:for循环

计算机中32位int类型变量的范围,其中int类型是带符号整数。 

即2^32是int的最大范围了

class Solution {
    public boolean isPowerOfTwo(int n) {
        for(int i=0;i<32;i++){
            if(n==Math.pow(2,i)){
                return true;
            }
        }
        return false;
        
        
    }
}

236、二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

 为什么说两个结点在左子树只要找到最先遍历的结点就可以:
        1、如果q是p的子孙,那么肯定先找到的是p,那么p就是p和q的公共祖先
        2、如果q不是p的子孙,那么在到达p之前,肯定会先到达p和q的公共祖先r,然后分别到达p和q,也就可以返回r了

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        /*
        为什么说找到一个就可以,因为:
        1、如果q是p的子孙,那么肯定先找到的是p,那么p就是p和q的公共祖先
        2、如果q不是p的子孙,那么在到达p之前,肯定会先到达p和q的公共祖先r,然后分别到达p和q,也就可以返回r了
        */
        if(root==null) return root;//终止条件1
        if(root.val==p.val||root.val==q.val) return root;//终止条件2
        TreeNode left=lowestCommonAncestor(root.left,p,q);
        TreeNode right=lowestCommonAncestor(root.right,p,q);
        if(left!=null&&right!=null) return root;
        return left==null?right:left; 
    }
}

263、丑数

class Solution {
    public boolean isUgly(int n) {
        if(n<=0) return false;
        if(n==1) return true;
        while(n%2==0){
            n=n/2;
        }
        while(n%3==0){
            n=n/3;
        }
        while(n%5==0){
            n=n/5;
        }
        return n==1;
    }
}
举报

相关推荐

day19

寒假:Day19

day19知识汇总

day19//快乐数

Day19 Java方法重载

机器学习随记【day19】

0 条评论