leetCode解题报告5道题(七)

题目一:Interleaving String

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = "aabcc",
s2 = "dbbca",

When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.

分析:

这道题是一道明显的DP题目,由于在这之前DP类型做得比较少,所以这道题目可能分析得不是那么好,网友们见谅哈!


居然题目是一个DP动态规划的题目,那么必定有一个状态转移方程式。

如果我们用一个boolean flags[][] 二维数组来存储状态信息

flags[i][j] 表示取S1中的前i个数和取S2中的前j个数


flags[i][j] == true : 表示S3的前(i+j)长度的子串还是满足S1和S2交叉结合的

flags[i][j] == false: 表示不满足


首先我们来讲下直到S3前面(i+j)长度的子串还满足可以由S1和S2交叉构成的

条件是(flags[i][j-1] == true && S2[j-1] == S3[i+j-1] ) || (flags[i-1][j] == true && S1[i-1] == S3[i+j-1] )

最后我们所要的结果就是当S1取S1.length长度,而S2取S2.length长度时,看是否满足,即flags[S1.length][S2.length]是否为true


AC代码:

public class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        int len1 = s1.length();
        int len2 = s2.length();
        int len3 = s3.length();
        //长度不等直接干掉
        if (len3 != (len2+len1)){
            return false;
        }
        //状态存储的二维数组
        boolean flags[][] = new boolean[len1+1][len2+1];
        flags[0][0] = true;
        
        for (int i=1; i<=len1; ++i){
            flags[i][0] = flags[i-1][0] && (s1.charAt(i-1) == s3.charAt(i-1));
        }
        for (int j=1; j<=len2; ++j){
            flags[0][j] = flags[0][j-1] && (s2.charAt(j-1) == s3.charAt(j-1));
        }
        
        for (int i=1; i<=len1; ++i){
            for (int j=1; j<=len2; ++j){
                flags[i][j] = ((flags[i][j-1] && s2.charAt(j-1) == s3.charAt(i+j-1)) 
                        || (flags[i-1][j] && s1.charAt(i-1) == s3.charAt(i+j-1)));
            }
        }
        return flags[len1][len2];
    }
}


题目二:Validate Binary Search Tree

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

分析:

题目要求我们判断一下一棵树,是否满足搜索二叉树的性质:

1、树的左边的所有结点都不能大于根的值

2、树的右边的所有结点都不能小于根的值


这题还是比较简单的递归问题哈。只是要注意的情况如下

             10 

      5             15

null  null    6     20

这种情况是不满足二叉搜索树的性质的,因为数值6在数值10的右侧,但6<10这样是不符合定义的。

因此当我们要判断左子树的时候,必须把

左子树中所有结点与root结点的值做比较,如果其中有一个大于root结点的值,那么就不满足题意

右子树中所有结点与root结点的值做比较,如果其中一个小于root结点的值,那么也不满足题意。


AC代码:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isValidBST(TreeNode root) {
        if (root == null){
            return true;
        }
        if (root.left == null && root.right == null){
            return true;
        }
        
        return solveValidBST(root.left, true, root.val) && solveValidBST(root.right, false, root.val);
    }
    /**
     * root: 当前结点
     * isLeft: 属于根节点的左边还是右边
     * compareValue: 根结点的值
     */
    public boolean solveValidBST(TreeNode root, boolean isLeft, int compareValue){
        
        if (root == null){
            return true;
        }
        //1: 判断是否满足   左<中<右
        boolean flag = true;
        if (root.left != null && root.left.val >= root.val){
            flag = false;
        }
        if (root.right != null && root.right.val <= root.val){
            flag = false;
        }
        
        //2: 判断是否满足所有的左<根  和  所有的右>根
        if (isLeft){
            if (compareValue <= root.val){
               flag = false; 
            }
        }else{
            if (compareValue >= root.val){
               flag = false; 
            }
        }
        boolean leftSubTre = solveValidBST(root.left, isLeft, compareValue);
        boolean rightSubTre = solveValidBST(root.right, isLeft, compareValue);
        return flag && leftSubTre && rightSubTre;
    }
}

题目三:

Sqrt(x)

 

Implement int sqrt(int x).

Compute and return the square root of x.

分析:

题目要求我们计算出一个int类型的数值的开平方的结果(注意:要的结果也是int型,而并非是double哦!)

我们先来分析下一种错误的解法TLE:

//如果数值x够大,所需的循环次数太多了

for (int i=0; i<=x; ++i){

if (i * i == x){

return i;

}

  if (i * i > x){

            return i-1; 

 }

}


因此我们必须想出一种更快的方法,我们将这些数和对应的开方的数写下来,观察一下规律!


这样我们可以发现,数字1所能涵盖x数有3个,数字2能涵盖的x数有5个,数字3能涵盖的x数有7个.........

这样子我们要求一个数x的平方根的int值,只需要用x循环减去3,5,7,9......,并用num记录下当前是数字几了,直到x的值小于等于0,这时候这个num就是我们要得到的结果了。

AC代码:

public class Solution {
    public int sqrt(int x) {
        if (x == 0)
            return 0;
            
        int step = 3;
        int num = 1;
        x = x - step;
        while (x > 0){
            num++;
            step += 2;
            x -= step;
        }
        return num;
    }
}


不能因为做题而做题哈,我们顺便看一下返回double类型的sqrt怎么写!

一个采用牛顿迭代法的函数
double sqrt(double number) 
{
        if(number<=0)return 0;
        //设置初始值i,i值越接近sqrt(number),所需循环次数越少
        double i = 1; //一个快速算法是:int exp;double i=ldexp(frexp(number,&exp),(exp>>1));
        double j = number/i;
        while((i<j?j-i:i-j)>1e-9)//随着循环次数的增加,i与j将非常接近
        {
                i = (i+j)/2;
                j = number/i ;
        }
        return i;
}

原理见:

泰勒级数展开法:f(x)=sqrt(x)在x=1处展开,得:
f(x) = 1+(1/2)×(x-1)+(0.5)×(-0.5)/2!×(x-1)²+(0.5)×(-0.5)×(-1.5)/3!×(x-1)³……
非常不建议使用级数展开,因为当数字比较大时收敛实在慢



题目四:

Recover Binary Search Tree

 

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.


分析:

题目给我们一棵树,这棵树中有两个结点的位置出现了错误(将它们两个的值交换之后就可以得到正确的二叉搜索树),让我们把这两个结点找出来,之后把它们交换得到正确的BST。要求不能够改变树原来的结构。

这道题目,我们分析下二叉搜索树的性质,可以知道,当我们用树的"中序遍历"遍历这棵树的时候,我们应该要得到一个呈增长的一个数列,但是如果这棵树有两个结点的值的位置不对的话,必定就会破坏这个增长数列。

举个例子

     2

  1    4

我们得到的中序遍历结果是: 1 ->  2  -> 4 (增长的趋势)

而如果是 

       2

    4     1

我们得到的中序遍历结果是: 4 -> 2  -> 1 (没有呈增长趋势)

这样子我们需要调换的两个位置是哪两个呢,很明显应该是   4  和  1的位置。

根据这样分析,我们用一个stack来存储中序遍历的结果,最后依次从栈顶往下扫,当遇到值大于栈顶的,表示不满足增长的规律,然后再一直往下直到找到这些大于栈顶的这些数中,最大的一个。即为我们要交换的数,具体看代码


AC代码:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 /**
  * 作者:胖虎 
  * csdn: http://blog.csdn.net/ljphhj 
  */
public class Solution {
    //存放值对应的结点
    private HashMap<Integer, TreeNode> map = new HashMap<Integer, TreeNode>();
    //栈:存放中序遍历的结果
    private Stack<Integer> stack = new Stack<Integer>();
    
    public void recoverTree(TreeNode root) {
        
        if (root == null || ((root.left == null) && (root.right == null))){
            return ;
        }
        
        MiddleOrderTralTree(root);
        int popNum = 0;
        if (!stack.empty()){
            popNum = stack.pop();
        }
        
        while (!stack.empty()){
            int nowNum = stack.pop();
            //存在了违反“增长趋势"的情况了.
            if (nowNum > popNum){
                //栈的元素一直往下找,直到找到违反“增长趋势”的元素中最大的那一个
                while (!stack.empty()){
                    int temp = stack.pop();
                    if (temp > popNum){
                        nowNum = temp;
                    }else{
                        break;
                    }
                }
                
                TreeNode mistakeOne = (TreeNode)map.get(nowNum);
                TreeNode mistakeTwo = (TreeNode)map.get(popNum);
                int temp = mistakeOne.val;
                mistakeOne.val = mistakeTwo.val;
                mistakeTwo.val = temp;
                return ;
            }
            popNum = nowNum;
        }
    }
    //中序遍历
    public void MiddleOrderTralTree(TreeNode root){
        if (root.left != null){
            MiddleOrderTralTree(root.left);
        }   
        //值放入栈中,并把 值,Object 存放到map中
        stack.push(root.val);
        map.put(root.val, root);
        
        if (root.right != null){
            MiddleOrderTralTree(root.right);
        }   
    }
    
}


题目五:

Climbing Stairs

 

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?


分析:

这个题目是很早的一个题目了,考察的其实就是斐波拉切数列的变形哈.

我们知道斐波那契数列的话是

f(0) = 0;

f(1) = 1;

f(n) = f(n-1) + f(n-2)  (n >= 2)

我们分析下我们这道题目:

如果N=0时,自然为0种

如果N=1时,这个家伙只有一种爬楼梯的方法

如果N=2时,他的选择有:1.一步步的爬   2.两步的 这样就有两种

但N=3时,他的选择可以是  1、先爬1步(然后剩下的处理跟两个台阶的一样咯)    2、先爬2步(剩下的处理跟一个台阶的一样咯)

.......

我们可以推导出这样的式子

f(0) = 0;

f(1) = 1;

f(2) = 2;

f(n) = f(n-1) + f(n-2);   (n>=3)


AC代码: (千万别想着用递归的方法,会TLE)

public class Solution {
    private int nums[];
    public int climbStairs(int n) {
        if (n == 0 || n == 1 || n == 2){
            return n;
        }
        nums = new int[n+1];
        nums[0] = 0;
        nums[1] = 1;
        nums[2] = 2;
        for (int i=3; i<=n; ++i){
            nums[i] = nums[i-1] + nums[i-2];
        }
        return nums[n];
    }
}


已标记关键词 清除标记
相关推荐
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲
<p> <strong><span style="font-size:24px;">课程简介:</span></strong><br /> <span style="font-size:18px;">历经半个多月的时间,</span><span style="font-size:18px;">Debug</span><span style="font-size:18px;">亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。</span><span></span> </p> <p> <span style="font-size:18px;">其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,</span><span style="font-size:18px;">Debug</span><span style="font-size:18px;">还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程!</span><span></span> </p> <p> <br /> </p> <p> <span style="font-size:24px;"><strong>核心技术栈列表</strong></span><span style="font-size:24px;"><strong>:</strong></span> </p> <p> <br /> </p> <p> <span style="font-size:18px;">值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括</span><span style="font-size:18px;">Spring Boot</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Spring MVC</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Mybatis</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Mybatis-Plus</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Shiro(</span><span style="font-size:18px;">身份认证与资源授权跟会话等等</span><span style="font-size:18px;">)</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Spring AOP</span><span style="font-size:18px;">、防止</span><span style="font-size:18px;">XSS</span><span style="font-size:18px;">攻击、防止</span><span style="font-size:18px;">SQL</span><span style="font-size:18px;">注入攻击、过滤器</span><span style="font-size:18px;">Filter</span><span style="font-size:18px;">、验证码</span><span style="font-size:18px;">Kaptcha</span><span style="font-size:18px;">、热部署插件</span><span style="font-size:18px;">Devtools</span><span style="font-size:18px;">、</span><span style="font-size:18px;">POI</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Vue</span><span style="font-size:18px;">、</span><span style="font-size:18px;">LayUI</span><span style="font-size:18px;">、</span><span style="font-size:18px;">ElementUI</span><span style="font-size:18px;">、</span><span style="font-size:18px;">JQuery</span><span style="font-size:18px;">、</span><span style="font-size:18px;">HTML</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Bootstrap</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Freemarker</span><span style="font-size:18px;">、一键打包部署运行工具</span><span style="font-size:18px;">Wagon</span><span style="font-size:18px;">等等,如下图所示:</span><span></span> </p> <img src="https://img-bss.csdn.net/201908070402564453.png" alt="" /> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:24px;">课程内容与收益</span><span style="font-size:24px;">:</span><span></span> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070403452052.png" alt="" /> </p> <p> <span style="font-size:18px;">总的来说,</span><span style="font-size:18px;">本课程是一门具有很强实践性质的“项目实战”课程,即“</span><span style="font-size:18px;">企业应用员工角色权限管理平台</span><span style="font-size:18px;">”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管理;其中,还重点讲解了如何基于</span><span style="font-size:18px;">Shiro</span><span style="font-size:18px;">的资源授权实现员工</span><span style="font-size:18px;">-</span><span style="font-size:18px;">角色</span><span style="font-size:18px;">-</span><span style="font-size:18px;">操作权限、员工</span><span style="font-size:18px;">-</span><span style="font-size:18px;">角色</span><span style="font-size:18px;">-</span><span style="font-size:18px;">数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图:</span> </p> <p> <span></span> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070404285736.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:18px;"><strong>以下为项目整体的运行效果截图:</strong></span> <span></span> </p> <img src="https://img-bss.csdn.net/201908070404538119.png" alt="" /> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405002904.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405078322.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405172638.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405289855.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405404509.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405523495.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p> <p style="text-align:left;"> <span style="font-size:18px;">值得一提的是,在本课程中,</span><span style="font-size:18px;">Debug</span><span style="font-size:18px;">也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:</span><span></span> </p> <img src="https://img-bss.csdn.net/201908070406328884.png" alt="" /> <p> <br /> </p>
<p> <strong><span style="background-color:#FFFFFF;color:#E53333;font-size:24px;">本页面购买不发书!!!仅为视频课购买!!!</span></strong> </p> <p> <strong><span style="color:#E53333;font-size:18px;">请务必到</span></strong><a href="https://edu.csdn.net/bundled/detail/49?utm_source=banner"><strong><span style="color:#E53333;font-size:18px;">https://edu.csdn.net/bundled/detail/49</span></strong></a><strong><span style="color:#E53333;font-size:18px;">下单购买课+书。</span></strong> </p> <p> <span style="font-size:14px;">本页面,仅为观看视频页面,如需一并购买图书,请</span><span style="font-size:14px;">务必到</span><a href="https://edu.csdn.net/bundled/detail/49?utm_source=banner"><span style="font-size:14px;">https://edu.csdn.net/bundled/detail/49</span></a><span style="font-size:14px;">下单购买课程+图书!!!</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">疯狂Python精讲课程覆盖《疯狂Python讲义》全书的主体内容。</span> </p> <span style="font-size:14px;">内容包括Python基本数据类型、Python列表、元组和字典、流程控制、函数式编程、面向对象编程、文件读写、异常控制、数据库编程、并发编程与网络编程、数据可视化分析、Python爬虫等。</span><br /> <span style="font-size:14px;"> 全套课程从Python基础开始介绍,逐步步入当前就业热点。将会带着大家从Python基础语法开始学习,为每个知识点都提供对应的代码实操、代码练习,逐步过渡到文件IO、数据库编程、并发编程、网络编程、数据分 析和网络爬虫等内容,本课程会从小案例起,至爬虫、数据分析案例终、以Python知识体系作为内在逻辑,以Python案例作为学习方式,最终达到“知行合一”。</span><br />
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页