剑指offer

java求二叉树的深度

◇◆丶佛笑我妖孽 提交于 2019-12-07 02:00:24
题目 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 解题 package demo18; class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } /** * 获取二叉树深度 * @author mengfeiyang * */ public class Solution2 { public int TreeDepth(TreeNode pRoot){ if(pRoot ==null) return 0; int nLeft=TreeDepth(pRoot.left); int nRight=TreeDepth(pRoot.right); return nLeft>nRight?(nLeft+1):(nRight+1); } /** * 测试 * @param args */ public static void main(String[] args) { Solution2 s2 = new Solution2(); /** * 构造二叉树 * 1 * / \ * 2 3 * / \ / \ * 4 5 6 7 */

JavaScript版《剑指offer》刷题(27)

匿名 (未验证) 提交于 2019-12-02 21:52:03
1.题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 2.题目分析 思路一:暴力枚举 先排序,然后找出中间的值,复杂的O(nlogn) 思路二:利用O(n)的空间,换取时间复杂度O(n) 基于快排思想中的partition函数来做,因为根据题目,那么排序后的数组中间的数就是那个出现次数超过一半的数,那么我只需要利用快排中的partition,找到长度为n的数组中间n/2大的那个数就行。 我们有成熟的时间复杂度为的算法得到数组中任意第k大的数字。只不过现在的K值为数组长度的一半。 思路三:利用这个数组的特性,保存两个值,一个是数组中的数字,另一个是次数。 根据数组特点来做,数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数的和还要多。因此,我们可以考虑在遍历数组的时候保存两个值:一个是数组中的一个数字;一个是次数。当我们便利到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1;如果下一个数字和我们之前保存的数字不同,则次数减1.如果次数为零,那我们需要保存下一个数字,并把次数设为1.由于我们要找的数字出现的次数比其他所有数字出现次数之和还要多

《剑指offer》树专题 (牛客10.25)

╄→尐↘猪︶ㄣ 提交于 2019-12-02 11:40:54
考察的知识点主要在于树的数据结构(BST,AVL)、遍历方式(前序,中序,后序,层次)、遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈。由于树本身就是一个递归定义的结构,所以在递归求解问题时,要善于将问题转化成合适的子问题,思考清楚子问题的形式、递归的出口、父问题与子问题的联系。 以下这些问题难度都不太大,很多都是一次过,比上次链表专题的思维难度小多了。 难度 题目 知识点 04. 重建二叉树 依据前序和中序遍历重建 , 递归 ★★ 17. 树的子结构 递归 18. 二叉树的镜像 简单递归 22. 从上往下打印二叉树 bfs , Queue的使用 23. 判断是否为二叉搜索树的后序遍历序列 BST , 递归 ★ 24. 二叉树中和为某一值的路径 dfs , 回溯 , Collections.sort() ★★ 26. 二叉搜索树与双向链表 递归 中序遍历 ★ 38. 二叉树的深度 递归 39. 平衡二叉树 平衡二叉树 递归 57. 二叉树的下一个结点 中序遍历 循环 回溯后的情况 58. 对称的二叉树 递归 可转化为非递归 59. 按之字形顺序打印二叉树 Stack 层次遍历变形 60. 把二叉树打印成多行 Queue LinkedList 层次遍历 ★★ 61. 序列化二叉树 递归 string.split() string.equals 62.

《剑指offer》链表专题 (牛客10.23)

柔情痞子 提交于 2019-12-02 03:53:36
难度 题目 知识点 03. 返回链表的反序 vector 递归,C++ STL reverse() * 14. 链表中倒数第k个结点 指针操作 15. 反转链表 头插法,递归 16. 合并两个有序链表 指针操作 *** 25. 复杂链表的复制 深度复制 * 36. 两个链表的第一个公共结点 栈辅助,链表拼接,链表截取 *** 55. 链表中环的入口结点 断链法,快慢指针 * 56. 删除链表中重复的结点 指针操作 03. 返回链表的反序 vector 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 递归或者对正序 vector reverse。 class Solution { public: vector<int> printListFromTailToHead(ListNode* head) { vector<int> rst; if(head == NULL)return rst; rst = printListFromTailToHead(head->next); rst.emplace_back(head->val); return rst; } }; //----------------------vv--------------------------------- class Solution { public: vector<int>

《剑指offer》-表示数值的字符串

南楼画角 提交于 2019-11-29 09:46:00
表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是 表示数字的字符串遵循模式 [+ | - ] [ A ] [ . [ B ]] [ e | E C] 符号不是必须的,但是如果有的话,必须是 +或者-,而且后面必须跟数字 整数部分不是必须的,比如 .123 代表 0.123 小数部分不是必须的,但是如果有小数部分,就一定有小数点。比如 123. 代表 123.0 123e2 指数部分也不是必须的,但是如果有的话,后面必须接数字 比如 123e 就是不合法的 根据这个逻辑,我们一共进行了4个判断,分别判断:符号、数字、小数点、e和E 使用 int cur 和 boolean isNum , isNum 代表 在 cur 之前的数字是否合法。 public class Solution { public int cur = 0 ; public boolean isNumeric ( char [ ] str ) { if ( str == null || str . length == 0 ) { return false ; } boolean isNum = signed

《剑指offer》 刷题记录(Python)

 ̄綄美尐妖づ 提交于 2019-11-27 04:50:23
本博客同时发布于个人主页: www.doctorsrn.cn 《剑指offer》 刷题记录 最近使用Python把《剑指offer》刷了一遍,自己能第一时间有想法的题目就直接写,没有思路的题目就看懂书上的思路和参考其他开源的实现后再自己写一遍。主要以 牛客网《剑指offer》 作为在线评测网站,有些题目牛客网没有的再找其他网站进行在线评测,主要使用的其他网站有: AcWing LintCode 刷题过程主要参考的开源实现有: https://github.com/Lazy-Pig/CodingInterviewChinese2 https://github.com/apachecn/Interview/tree/master/docs/Algorithm/剑指offer/Python 本博客对应的 代码仓库 在此。 今年企业缩招,找工作的行情不容乐观,秋招路漫漫啊。 3.数组中重复数字 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 ## 方法一:排序,然后查找 ## 时间复杂度:O(nlog n) 空间复杂度:* # -*- coding:utf-8 -*-

《剑指offer》-找到字符串中第一个只出现一次的字符,并返回它的位置

帅比萌擦擦* 提交于 2019-11-26 18:28:17
/* *在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 */ import java.util.*; public class FirstNotRepeatingChar { //暴力搜索法:O(n^2) public int firstNotRepeatingChar(String str) { if(str.length() == 0) return -1; List<String> list = new ArrayList<String>(); int index = 0; boolean flag = true; for(int i = 0;i < str.length() - 1;i ++) { char c = str.charAt(i); //保证每一次内部循环的不会是以前执行过的字符 if(!list.contains(c + "")) { list.add(c + ""); //System.out.println("遍历的字符:" + c); flag = true; //每一次循环之前要将flag复位 for(int j = i + 1;j < str.length();j ++) { if(str.charAt(j) == c) { flag = false; //发现有重复,没找到,跳出循环 /