leetCode解题报告5道题(二)

leetcode上比较简单的几道题,不想分开写几篇博文来记录哈,所以写在一起了!!

虽然几道题都比较简单,但感觉自己写得不好,希望博文如果被哪位大神看到,可以留言下写下你的做法!

题目一:

Maximum Depth of Binary Tree

 

Given a binary tree, find its maximum depth.

The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

题意:给你一个二叉树的根结点,求出树的深度!(递归)


/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public int maxDepth(TreeNode root) {
        return findMaxDepth(root);
    }
    
    public int findMaxDepth(TreeNode node){
        if (node == null)   //结点为null,返回0
            return 0;
        if (node.left == null && node.right == null)   //如果为叶子结点:返回深度1
            return 1;
        int leftDepth = findMaxDepth(node.left);    //求出左子树的最大深度
        int rightDepth = findMaxDepth(node.right);  //求出右子树的最大深度
        return leftDepth > rightDepth ? leftDepth+1 : rightDepth+1; //比较左右子树的深度,取最大值+1 得出整个子树的深度
    }
}


题目二:

Sum Root to Leaf Numbers

 

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.

An example is the root-to-leaf path 1->2->3 which represents the number 123.

Find the total sum of all root-to-leaf numbers.

For example,

    1
   / \
  2   3

The root-to-leaf path 1->2 represents the number 12.
The root-to-leaf path 1->3 represents the number 13.

Return the sum = 12 + 13 = 25.

题意:给你一棵二叉树,请你输出所有路径的和,路径上的结点的值连接起来组成这条路径的值(简单的递归算法)


/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    
    public int calSum(TreeNode root, int sum){
        if (root == null)
            return sum;
        if (root.left == null && root.right == null) //循环结束条件
            return sum * 10 + root.val;
        int leftChildSum = 0;
        int rightChildSum = 0;
        if (root.left != null){	//递归调用
            leftChildSum = calSum(root.left, sum * 10 + root.val);
        }
        if (root.right != null){//递归调用
            rightChildSum = calSum(root.right, sum * 10 + root.val);
        }
        
        return (leftChildSum + rightChildSum);
    }
    
    public int sumNumbers(TreeNode root) {
        if (root == null)
            return 0;
        return calSum(root, 0);
    }
}

题目三:

Unique Binary Search Trees

Given n, how many structurally unique BST's (binary search trees) that store values 1...n?

For example,
Given n = 3, there are a total of 5 unique BST's.

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

题意:给你一个数n, 这个n表示二叉树拥有1,2,....,n这n个节点,让你去求不相等的又满足BST(二叉搜索树)特性的二叉树有多少种情况。

分析:递归问题哈

这道题是递归的意思在这里面
 * 情况:
 * n=1  : 只有一种可能,则返回1
 * n=2  : 两种可能返回2;
 * n=3  : 返回5;
 * n>3  : 我们知道,如果一个问题特别大,我们会想办法把它分解成小问题来解决
 * 我们取特殊情况n=4来做下分析
 * 如果n=4, 二叉树根结点的值可以是:1,2,3,4这四种情况
 * 
 * 设root.val 用 i来表示, for循环 i < n, 左子树上的结点数量: i-1, 右子树上的结点数量: n-i
 * 
 * 而当i=1的时候,左子树结点Number: i-1=0 ,右子树结点Number: n-i=4-1=3
 * 此时这种情况得到的二叉树个数便转换成了求右边3个结点拥有的情况数量(递归)
 * 
 * 而当i = 2的时候,左子树结点Number: i-1=1 ,右子树结点Number: n-i=4-2=2
 * 此时这种情况得到的二叉树个数便转换成了求左边情况的个数*右边情况的个数(组合数学)
 * [当然如果左边或者右边有一方为0的话,就返回一支子树的数量就行了]
 * 
 * 而当i = 3的时候,左子树结点Number: i-1=2 ,右子树结点Number: n-i=4-3=1
 * 此时这种情况得到的二叉树个数便转换成了求左边情况的个数*右边情况的个数(组合数学)
 * [当然如果左边或者右边有一方为0的话,就返回一支子树的数量就行了]
 * 
 * 而当i = 4的时候,左子树结点Number: i-1=3 ,右子树结点Number: n-i=4-4=0
 * 此时这种情况得到的二叉树个数便转换成了求左边3个结点拥有的情况数量(递归)
 * 
 * 最终所有情况加起来就是 n = 4的所有二叉树数目


AC代码:

package copylist;

/**
 * 
 * @Description:  [leetcode Unique Binary Search Trees]
 * @Author:       [胖虎]   
 * @CreateDate:   [2014-4-3 下午8:19:44]
 * @CsdnUrl:      [http://blog.csdn.net/ljphhj]
 */
public class Solution {
    public int numTrees(int n) {
        
        if (n == 0 || n == 1)
            return n;
            
        return calSum(n);
    }
    public int calSum(int n){
        int sum = 0;
        if (n == 1)
            return 1;
        if (n == 2)
            return 2;
        if (n == 3)
            return 5;
        /*求出所有root.val = i的情况,然后相加就是n的二叉树的所有情况*/
        for (int i=1; i<=n; ++i){
            sum += deal(i-1,n-i);
        }
        return sum;
    }
    /*
     * 计算左右子树的情况数,并求出整体的情况数
     * 
     * */
    public int deal(int leftnumber, int rightnumber){
        int sumleft = 0;
        int sumright = 0;
        
        int sum = 0;
        if (leftnumber == 1 || leftnumber == 0)
        	sumleft += leftnumber;
        else{
        	sumleft += calSum(leftnumber);
        }
        if (rightnumber == 1 || rightnumber == 0)
        	sumright += rightnumber;
        else{
        	sumright += calSum(rightnumber);
        }
        /*如果有一个子树上没有节点,则返回另一个子树的数量即可*/
        if (sumleft == 0)
        	return sumright;
        if (sumright == 0)
        	return sumleft;
        
        sum = sumleft * sumright;	//组合数学:总数等于左右子树的情况数的乘积
        
        return sum;
    }
    
    public static void main(String[] args) {
    	Solution s = new Solution();
		System.out.println(s.numTrees(1));
		System.out.println(s.numTrees(2));
		System.out.println(s.numTrees(3));
		System.out.println(s.numTrees(4));
		System.out.println(s.numTrees(5));
	}
}

题目四:

N-Queens && N-Queens II

这两个题目是类似的:都是N皇后问题,我之前有一篇文章写的就是总结递归问题和分治思想的,那里面对N皇后问题进行了很详细的解说,所以这里就不重复了。
 

我们来看下这两题的题目和AC代码:

题目1(N-queens):

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

For example,
There exist two distinct solutions to the 4-queens puzzle:

[
 [".Q..",  // Solution 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // Solution 2
  "Q...",
  "...Q",
  ".Q.."]
]

AC代码:

package copylist;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 典型的N皇后问题
 * @Description:  [leetcode N-Queens]
 * @Author:       [胖虎]   
 * @CreateDate:   [2014-4-3 下午8:19:44]
 * @CsdnUrl:      [http://blog.csdn.net/ljphhj]
 */
public class Solution {
	private ArrayList<String[]> result = new ArrayList<String[]>();
    private int[][] conflicts;
    private int[] queens;	//int[row] = col
	private int count = 0;
	private int n;
	
	public ArrayList<String[]> solveNQueens(int n) {
		if(n == 0)
			return result;
		//init
		conflicts = new int[n][n];
		queens = new int[n];
		this.n = n;
		solve(0);
		return result;
    }
	
    public void solve(int row){
    	
    	for (int col=0; col<n; ++col){
    		if (conflicts[row][col] == 0){
    			queens[row] = col;
    			//add conflict
    			for (int i=row+1; i<n; ++i){
    				//"|"
    				conflicts[i][col]++;
    				//"\"
    				if ((col - (i - row)) >= 0){
    					conflicts[i][(col - (i - row))]++;
    				}
    				//"/"
    				if ((col + (i - row)) < n){
    					conflicts[i][(col + (i - row))]++;
    				}
    			}
    			
    			if (row == n-1){
    				String[] strings = new String[n];
    				for(int i=0; i<n; ++i){
    					strings[i] = "";
    					for (int j=0; j<n; ++j){
    						if (j == queens[i]){
    							strings[i] += "Q";
    						}else{
    							strings[i] += ".";
    						}
    					}
    				}
    				result.add(strings);
    			}else{
    				solve(row+1);
    			}
    			
    			//remove conflict
    			for (int i=row+1; i<n; ++i){
    				//"|"
    				conflicts[i][col]--;
    				//"\"
    				if ((col - (i - row)) >= 0){
    					conflicts[i][(col - (i - row))]--;
    				}
    				//"/"
    				if ((col + (i - row)) < n){
    					conflicts[i][(col + (i - row))]--;
    				}
    			}
    		}
    	}
    	
    }
    
    
    public static void main(String[] args) {
    	Solution s = new Solution();
    	ArrayList<String[]> list = s.solveNQueens(8);
    	int i=0;
    	for (String[] string : list) {
    		System.out.println("解法" + ++i + ":");
			for (String string2 : string) {
				System.out.println(string2);
			}
		}
	}
}

题目2(N -queens II ):

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.


就是题目1的答案哈,只不过它要返回的值是所有解的个数,我们都能得到所有解,还怕得不到个数么?

AC代码:

public class Solution {
    private int[][] conflicts;
	private int count = 0;
	private int n;
	
	public void solveNQueens(int n) {
		if(n == 0)
			return;
		//init
		conflicts = new int[n][n];
		this.n = n;
		solve(0);
    }
	
    public void solve(int row){
    	
    	for (int col=0; col<n; ++col){
    		if (conflicts[row][col] == 0){
    			//add conflict
    			for (int i=row+1; i<n; ++i){
    				//"|"
    				conflicts[i][col]++;
    				//"\"
    				if ((col - (i - row)) >= 0){
    					conflicts[i][(col - (i - row))]++;
    				}
    				//"/"
    				if ((col + (i - row)) < n){
    					conflicts[i][(col + (i - row))]++;
    				}
    			}
    			
    			if (row == n-1){
    				count++;
    			}else{
    				solve(row+1);
    			}
    			
    			//remove conflict
    			for (int i=row+1; i<n; ++i){
    				//"|"
    				conflicts[i][col]--;
    				//"\"
    				if ((col - (i - row)) >= 0){
    					conflicts[i][(col - (i - row))]--;
    				}
    				//"/"
    				if ((col + (i - row)) < n){
    					conflicts[i][(col + (i - row))]--;
    				}
    			}
    		}
    	}
    	
    }
    public int totalNQueens(int n) {
        solveNQueens(n);
        return count;
    }
}


题目五:

Pow(x, n)

 题目:Implement pow(xn).

分析:要我们实现一个pow这样的函数,哈哈,用JAVA用惯了,突然要你实现api里面的其中一个函数,是不是觉得很无语哈,不过这题明显是有陷阱的

如果你用for循环,去做n次 x 的乘法运算,那肯定是会超时的,那如何算会比较快呢?

我们想到初高中的数学公式

1、X^n = (X^2) ^ (n/2) [当n是偶数的时候]

2、X^n = X * (X^2) ^ ((n-1)/2) [当n是奇数的时候]

这样子我们就可以把这个问题转换成 递归或者分治思想这样的题目啦!

很奇妙吧!看AC代码哈~~


package copylist;
/**
 * 
 * @Description:  [pow(x,n)的java实现代码]
 * @Author:       [胖虎]   
 * @CreateDate:   [2014-4-3 下午10:24:57]
 * @CsdnUrl:      [http://blog.csdn.net/ljphhj]
 */
public class Solution {
    public double pow(double x, int n) {
    	//如果n<0 那么结果是等于 x^n的倒数,即 1/x^n
    	//为了方便运算,我们先把n统一成正数
        int y = n > 0 ? n : -n;
        if (n == 0){
        	// x^0 = 1;
        	return 1;
        }
        if (n == 1){
        	// x^1 = x;
        	return x;
        }
        double result;
        if (y % 2 == 0){
        	result = pow(x*x, y / 2);
        }else{
        	result = pow(x*x, (y-1) / 2) * x;
        }
        return n > 0 ? result : 1.0 / result;
    }
    
    public static void main(String[] args) {
    	System.out.println(new Solution().pow(34.00515, -3));
	}
}



已标记关键词 清除标记
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问设计,可以完美修复该问。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了易用的一键式设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。在常规修复过程中,程序还会自动检测DirectX加速状态,在异常时给予用户相应提示。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V4.0版分为标准版、增强版以及在线修复版。所有版本都支持修复DirectX的功能,而增强版则额外支持修复c++的功能。在线修复版功能与标准版相同,但其所需的数据包需要在修复时自动下载。各个版本之间,主程序完全相同,只是其配套使用的数据包不同。因此,标准版和在线修复版可以通过补全扩展包的形式成为增强版。本程序自V3.5版起,自带扩展功能。只要在主界面的“工具”菜单下打开“选项”对话框,找到“扩展”标签,点击其中的“开始扩展”按钮即可。扩展过程需要Internet连接,扩展成功后新的数据包可自动生效。扩展用时根据网络速度不同而不同,最快仅需数秒,最慢需要数分钟,烦请耐心等待。如扩展失败,可点击“扩展”界面左上角小锁图标切换为加密连接,即可很大程度上避免因防火墙或其他原因导致的连接失败。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有更新系统c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。除常规修复外,新版程序还支持C++强力修复功能。当常规修复无效时,可以到本程序的选项界面内开启强力修复功能,可大幅提高修复成功率。请注意,请仅在常规修复无效时再使用此功能。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 新版程序支持命令行运行模式。在命令行中调用本程序,可以在路径后直接添加命令进行相应的设置。常见的命令有7类,分别是设置语言的命令、设置窗口模式的命令,设置安全级别的命令、开启强力修复的命令、设置c++修复模式的命令、控制Direct加速的命令、显示版权信息的命令。具体命令名称可以通过“/help”或“/?”进行查询。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了7项高级功能。点击"常规”选项卡可以调整程序的基本运行情况,包括日志记录、安全级别控制、调试模式开启等。只有开启调试模式后才能在C
相关推荐
<p> <span style="color:#4d4d4d;">当前课程中博客项目的实战源码是我在 GitHub上开源项目 My-Blog,目前已有 2000 多个 star:</span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdnimg.cn/202103310649344285.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 个人博客项目功能的讲解,<span style="color:#565656;">通过本课程的学习,不仅仅让你掌握基本的 Spring Boot 开发能力以及 Spring Boot 项目的大部分开发使用场景,同时帮你提前甄别和处理掉将要遇到的技术难点,认真学完这个课程后,你将会对 Spring Boot 有更加深入而全面的了解,同时你也会得到一个大家都在使用的博客系统源码,你可以根据自己的需求和想法进行改造,也可以直接使用它来作为自己的个人网站,这个课程一定会给你带来巨大的收获。</span></span> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"> </span></span> </p> <p> <span style="color:#e53333;"><span style="color:#e53333;"><strong>课程特色</strong></span></span> </p> <p> <span style="color:#e53333;"><span style="color:#e53333;"><strong> </strong></span></span> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"> </span></span> </p> <ol> <li> <span style="color:#565656;">课程内容紧贴 Spring Boot 技术栈,涵盖大部分 Spring Boot 使用场景。</span> </li> <li> <span style="color:#565656;">开发教程详细完整、文档资源齐全、实验过程循序渐进简单明了。</span> </li> <li> <span style="color:#565656;">实践项目页面美观且实用,交互效果完美。</span> </li> <li> <span style="color:#565656;">包含从零搭建项目、以及完整的后台管理系统和博客展示系统两个系统的功能开发流程。</span> </li> <li> <span style="color:#565656;">技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,对于提升你的市场竞争力有一定的帮助。</span> </li> </ol> <p> <strong>实战项目预览</strong> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"><span style="color:#e53333;"><strong> </strong></span></span></span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150303066258.png" alt="" /><br /> </span> </p> <p>   </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150305396930.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150305528842.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150306056323.png" alt="" /><br /> </span> </p>
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页