剑指 Offer 55 - II. 平衡二叉树 Offer_55_2 题目描述 方法一:使用后序遍历+边遍历边判断 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/9 20:58 */ /** * 题目描述:输入一棵二叉树的根节点,判断该树是不是平衡二叉树. * 如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. */ import sun.reflect.generics…
题目 剑指 Offer 55 - II. 平衡二叉树 思路1(后序遍历+剪枝) 这题是上一题剑指 Offer 55 - I. 二叉树的深度的进阶,逻辑代码和那个一样,也是后续遍历,获取两个子节点较大的那个深度再加上当前一层返回给父节点,是自底向上的 也为要求是否为平很二叉树,要保证他的左子树和右子树差值不大于1,那么我们就在每次获取左右子树的深度的时候再加一个判断就好啦- 但是我们可以进行剪枝优化,如果不剪枝,就算判定为不是平衡二叉树,那么它还是会递归遍历完.当发现不是平衡二叉树的时候,我们返回…
题目描述 输入一棵二叉树的根节点,判断该树是不是平衡二叉树.如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 示例1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true. 示例2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4 返回 false. 限制: 1 <= 树的结点个数 <= 10000 来源:力扣(LeetCode) 链…
[简单-剑指 Offer 53 - II. 0-n-1中缺失的数字] 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 示例 1: 输入: [0,1,3] 输出: 2 示例 2: 输入: [0,1,2,3,4,5,6,7,9] 输出: 8 限制: 1 <= 数组长度 <= 10000 方法1:遍历数组,在遍历的过程中比较数组下标与数值是否相同,不相同则输出下标即可. class…
剑指 Offer 68 - II. 二叉树的最近公共祖先 Offer_68_2 题目详情 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/16 14:01 */ /** * 题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. */ public class Offer_68_2 { public TreeNode lowestCommonAncestor(Tre…
剑指 Offer 58 - II. 左旋转字符串 Offer_58_2 题目描述 java代码 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/12 17:58 */ /** * 题目详情:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部. * 请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cd…
剑指 Offer 57 - II. 和为s的连续正数序列 Offer_57_2 题目描述 方法一:暴力枚举 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/12 16:42 */ /** * 题目描述:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). * 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列. */ import java.util…
剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/10 13:43 */ /** * 题目描述:在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. */ public class Offer_56_2 { public int sing…
剑指 Offer 53 - II. 0-n-1中缺失的数字 Offer_53 题目详情 java代码 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/9 20:33 */ /** * 题目详情:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内. * 在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. */ public class Of…
剑指 Offer 32 - II. 从上到下打印二叉树 II Offer_32 题目描述: 题解分析: 这道题我一开始想到的解决方法较粗暴,就是使用两个变量来记录当前层的节点数和下一层的结点数. 以上的方法虽然可行,但是较复杂.实际每次队列里存储的就是当前层的所有结点,利用这个性质可以较快解题. 解法一: package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/1 14:50 */ import java.u…
剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 19:19 */ import java.util.ArrayDeque; import java.util.Deque; import java.util.LinkedList; import java.util.Queue; /** * 队列中的最大值:剑指 Offer 59 - II. 队列的最…
剑指 Offer 32 - II. 从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 提示: 节点总数 <= 1000 一.遍历(BFS) 本题首先要设置一个队列queue,一个list,一个临时列表. 算法流程大概如下: 首先把头结点放入queue,然后再把头结…
剑指 Offer 68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)." 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7…
题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了,从左到右第一个不相等位置的索引值就是缺失的数字的值 所以我们使用二分法查找第一个索引值和数组的值不相等的位置,此时索引值就是我们要的结果了 如果没有缺失,就输出数组的长度 代码 class Solution { public int missingNumber(int[] nums) { int l…
题目 剑指 Offer 57 - II. 和为s的连续正数序列 思路1(双指针/滑动窗口) 所谓滑动窗口,就是需要我们从一个序列中找到某些连续的子序列,我们可以使用两个for循环来遍历查找,但是未免效率太低了.因此我们可以用一个窗口,从左到右只需要遍历一次,然后每次判断当前窗口是否满足条件,不满足就扩大窗口或者缩小窗口,当滑动窗口从左边滑动到了右边,就可以得到最优解了. 滑动窗口的左边界和右边界都只能向右移动,因此只遍历一遍数组,从而时间复杂度是\(O(N)\) 该题要求是待遍历的序列是从1-t…
题目 剑指 Offer 55 - I. 二叉树的深度 思路1(DFS) 后续遍历吧,先遍历到最深(递归到末尾返回0),然后从后面一步一步比较取大的值返回,每次返回层数都加1, 执行流程是怎样的:比如其中一个节点左子树为空,右子树有一个叶子节点,那么 0 > 1 ,肯定选 1 ,再加上当前一层 1 ,返回 2 给父节点:然后到了父节点对两个子节点的比较,其中一个节点就是刚才的 2 ,如果另一个返回的深度为4,那么就取 4 ,再加上当前的 1 返回 5 给它的父节点--直到返回到根节点,此时就得到了…
  题目描述:   输入一棵二叉树,判断该二叉树是否是平衡二叉树.这里的定义是:如果某二叉树中任意结点的左.右子树的深度相差不超过1,那么它就是一棵平衡二叉树.   解题思路:   首先对于本题我们要正确理解,一般情况下,平衡二叉树就是AVL树,它首先是二叉搜索树(左小右大),其次满足左右子树高度之差不超过1.但是在本题中,没有二叉搜索树的要求,只对平衡与否进行判断即可.   根据求二叉树深度的思路我们很容易想到一种解法,即:在遍历树的每一个结点时,求其左右子树的深度,判断深度之差,如果每个结点…
[题目]判断一颗二叉树是不是平衡二叉树. * 平衡二叉树定义:任意子节点深度相差不超过1.[思路]由上题,利用递归得到二叉树每个结点的深度同时比较. package com.exe9.offer; import com.exe9.offer.BTreeDepth.TreeNode; /** * [题目]判断一颗二叉树是不是平衡二叉树. * 平衡二叉树定义:任意子节点深度相差不超过1. * [思路]由上题,利用递归得到二叉树每个结点的深度同时比较. * @author WGS * */ publi…
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 题目分析 第一种方法: 正常思路,应该会获得节点的左子树和右子树的高度,然后比较高度差是否小于1. 可是这样有一个问题,就是节点重复遍历了,影响效率了. 第二种方法: 改进办法就是在求高度的同时判断是否平衡,如果不平衡就返回-1,否则返回树的高度. 并且当左子树高度为-1时,就没必要去求右子树的高度了,可以直接一路返回到最上层了   代码 第一种: function IsBalanced_Solution(pRoot) { if (pRo…
39. 是否为平衡二叉树 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树 任意结点的左右子树高度差不大于1就是平衡二叉树. C++解法 class Solution { public: bool flag = true; // 记录是否为平衡二叉树,不是则为false bool IsBalanced_Solution(TreeNode* pRoot) { preOrder(pRoot); return flag; } // 前序递归遍历 int preOrder(TreeNode* pR…
题目信息 时间: 2019-06-25 题目链接:Leetcode tag: 队列 BFS 难易程度:简单 题目描述: 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 示例1: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 提示 1.节点总数 <= 1000 解题思路 本题难点 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树…
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目地址 https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&tqId=11208&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 思路 第一步:判断是否存在环,用快慢指针,一个走一步,一个走两步…
题目描述 一个链表中包含环,请找出该链表的环的入口结点. [思路]根据set集合的不重复,遍历链表时遇到的第一个重复结点就是环的入口结点. /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { if(pHead =…
题目描述 输入两个链表,找出它们的第一个公共结点. 题解: 分别遍历两个链表到链尾,并计算其长度,若最后一个节点相同,则存在公共节点 然后让长链表指针从头先移动长度差个节点,然后两个链表指针一起移动,第一个出现的 相同节点就是公共节点 class Solution { public: ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) { if (pHead1 == nullptr || pHead2 == null…
本题 题目链接 题目描述 我的题解 二分法 思路分析 排序数组中的搜索问题,首先想到二分法 当nums[center] > center 时,缺少的数在左区间 当nums[center] = center 时,缺少的数在右区间 代码如下 public int missingNumber(int[] nums) { int l = 0, r = nums.length - 1; while (l <= r) { int cent = (r + l) / 2; if (nums[cent] >…
本题 题目链接 题目描述 我的题解 方法一:使用库函数 s.substring() 代码如下 public String reverseLeftWords(String s, int n) { return s.substring(n, s.length()) + s.substring(0, n); } 复杂度分析: 时间复杂度: O(N) 空间复杂度: O(N) 方法二:遍历 思路分析 若面试中不允许使用 切片函数,则可用此方法 新建一个StringBuild字符串(不用String!消耗空…
本题 题目链接 题目描述 我的题解 方法三双100%, 方法一 适合范围广 方法一:双指针(也叫 滑动窗口) 思路分析 用两个指针i和表示当前枚举到的以i为起点,j为终点的区间,sum表示[i,j]的区间和: 当sum < tiarget,j指针向前移动,扩大区间,增大区间和.即:j++,sum+=j : 当sum > target,i指针向前移动,收缩区间,减小区间和.即:sum-=i,i++: 当sum == target,i指针向前移动2个单位,j向前移动一个单位.即sum = sum-…
题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = [9,1,7,9,7,9,7] 输出:1 限制: 1 <= nums.length <= 10000 1 <= nums[i] < 2^31 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi…
题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最大深度 3 . 提示: 节点总数 <= 10000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof 代码实现 /** * Defi…
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4]输出: 5 思路:运用归并排序的特点,merge的过程中如果后面区间的数字比前面区间的数字要小的话,则可以利用下标关系一次计算出当前区间中的所有逆序对,从而优化时间复杂度,缺点就是归并排序会用到一个辅助数组,所以会增加空间复杂度,也算是一种用时间换取空间的思想.因为计算逆序对直接相减就可以算出来了,所以整体的时间复杂度仍然是排序过程的…