算法题
cc每天都要进步一点点
这个作者很懒,什么都没留下…
展开
-
力扣621. 任务调度器
题目:给你一个用字符数组tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。你需要计算完成所有任务所需要的 最短时间 。示例 1:输入:tasks = ["A","A","A...原创 2022-04-10 10:59:22 · 111 阅读 · 0 评论 -
力扣55. 跳跃游戏
题目:给定一个非负整数数组nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永...原创 2022-04-10 10:26:14 · 90 阅读 · 0 评论 -
力扣11. 盛最多水的容器(双指针)
题目:给定一个长度为 n 的整数数组height。有n条垂线,第 i 条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为49。思路:双指针时空复杂度:...原创 2022-04-10 09:55:29 · 114 阅读 · 0 评论 -
【华为面试手撕代码】
文章目录常用的排序算法1.冒泡排序2.选择排序3.插入排序4.快排排序5.归并排序6.堆排序Java 的sort基于什么实现排序算法原理,何为稳定不稳定,快排是否稳定查找二分查找复盘笔试题3.寻找重复的子树树的遍历方式树的遍历方式(先序、中序、后序)先序中序后序如何用数组模拟二叉树的遍历过程?求二叉树的深度两种方法栈、队列232. 用栈实现队列225. 用队列实现栈字符串序列化与反序列化寻找字符串最长回文串最大公共前缀找出出现次数最多的字符字符串中的最长不重复子串动态规划跳台阶最长公共子序列链表反转链表三种原创 2022-04-08 16:01:41 · 9993 阅读 · 1 评论 -
力扣85. 最大矩形
题目:给定一个仅包含0和1、大小为rows x cols的二维二进制矩阵,找出只包含1的最大矩形,并返回其面积。思路: 用一个数组记录贴地的柱子高度,从row=0,开始一直到矩阵最底一行。之后计算柱子面积。算是复用代码class Solution { public int maximalRectangle(char[][] matrix) { /* 这题与84柱子中矩形的最大面积十分类似 不过是上一题问题的...原创 2022-04-03 20:04:20 · 251 阅读 · 0 评论 -
力扣84. 柱状图中最大的矩形
题目:给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。思路:1.核心思想:求每条柱子可以向左右延伸的长度->矩形最大宽度;矩形的高->柱子的高度。计算以每一根柱子高度为高的矩形面积,维护面积最大值2.朴素的想法:遍历每一根柱子的高度然后向两边进行扩散找到最大宽度3.单调栈优化:因为最终的目的是寻找对应柱子height[i]右边首个严格小于height[i]的柱子height[...原创 2022-04-03 20:00:02 · 176 阅读 · 0 评论 -
力扣42. 接雨水
题目:给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。思路:维护一个单调栈,单调栈存储的是下标,满足从栈底到栈顶的下标对应的数组 height 中的元素递减。从左到右遍历数组,遍历到下标 i时,如果栈内至少有两个元素,记栈顶元素为 top,top 的下面一个元素是 left,则一定有 height[left]≥height[top]。如果 height[i]>height[top],则得到一个可以接雨水的区域,该区域的宽度是...原创 2022-04-03 19:03:03 · 85 阅读 · 0 评论 -
力扣32. 最长有效括号
题目:给你一个只包含'('和')'的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例 1:输入:s = "(()"输出:2解释:最长有效括号子串是 "()"示例 2:输入:s = ")()())"输出:4解释:最长有效括号子串是 "()()"示例 3:输入:s = ""输出:0思路:class Solution { public int longestValidParentheses(String s) { ...原创 2022-04-03 18:20:47 · 198 阅读 · 0 评论 -
力扣581. 最短无序连续子数组
题目:给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。示例 1:输入:nums = [2,6,4,8,10,9,15]输出:5解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。示例 2:输入:nums = [1,2,3,4]输出:0示例 3:输入:nums = [1]输出:0思路:...原创 2022-04-03 16:04:40 · 40 阅读 · 0 评论 -
力扣394. 字符串解码
题目:给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像3a或2[4]的输入。示例 1:输入:s = "3[a]2[bc]"输出:"aaabcbc"...原创 2022-04-03 15:36:20 · 130 阅读 · 0 评论 -
力扣155. 最小栈
题目:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类:MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int getMin() 获取堆栈中的最小元素实例:输入:["MinStack","push","push","push","getMin","pop","top","ge...原创 2022-04-03 14:47:29 · 59 阅读 · 0 评论 -
力扣437. 路径总和 III
题目:给定一个二叉树的根节点 root,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。思路:双重递归思路:首先先序递归遍历每个节点,再以每个节点作为起始点递归寻找满足条件的路径class Solution { int count = 0; public int pathSum(TreeNode roo...原创 2022-04-03 14:40:29 · 50 阅读 · 0 评论 -
力扣297. 二叉树的序列化与反序列化
题目:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。思路: 先序遍历的递归思想1.序列化:先序遍历结果(StringBuilder节约空间)2.反序列化:将String类型...原创 2022-04-02 19:46:38 · 154 阅读 · 0 评论 -
力扣538. 把二叉搜索树转换为累加树
题目:给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node的新值等于原树中大于或等于node.val的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。思路:二叉搜索树的中序遍历是一个单调递增的有序序列。如果我们反序地中序遍历该二叉搜索树,即可得到一...原创 2022-04-02 19:17:23 · 66 阅读 · 0 评论 -
力扣543. 二叉树的直径
题目:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。思路:任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。假设我们知道对于该节点的左儿子向下遍历经过最多的节点数 L(即以左儿子为根的子树的深度) 和其右儿子向下遍历经过最多的节点数 R (即以右儿子为根的子树的深度),那么以该节点为起点的路径经过节点数的最大值即为 L+R+1 。...原创 2022-04-02 17:44:47 · 444 阅读 · 0 评论 -
力扣617. 合并二叉树
题目:给你两棵二叉树: root1 和 root2 。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。思路:递归1.如果 r1和r2中,只要有一个是null,函数就直接返回另一个节点;2.否则让r1的值等于r1和r2的值累加,再递归的计算...原创 2022-04-02 16:05:05 · 47 阅读 · 0 评论 -
力扣236.二叉树的最近公共祖先
题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。思路:递归若 root 是 p, q的 最近公共祖先 ,则只可能为以下情况之一:1.p和 q在 root 的子树中,且分列 root 的 异侧(即分别在左、右子树中);2.p = root ,且 q在 root 的左或右子...转载 2022-04-02 15:50:41 · 73 阅读 · 0 评论 -
力扣124. 二叉树中的最大路径和
其实还不太懂class Solution { int maxSum = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { maxGain(root); return maxSum; } public int maxGain(TreeNode node) { if (node == null) { return 0; ..原创 2022-04-02 15:07:56 · 60 阅读 · 0 评论 -
力扣114. 二叉树展开为链表
题目:给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。思路:递归实现前序遍历对二叉树进行前序遍历,获得各节点被访问到的顺序。由于将二叉树展开为链表之后会破坏二叉树的结构,因此在前序遍历结束之后更新每个节点的左右子节点的信息,将二叉树展开为单链表。class Soluti...原创 2022-04-02 15:06:13 · 643 阅读 · 0 评论 -
力扣104. 二叉树的最大深度
题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。思路: 其实就是二叉树层序遍历class Solution { public int maxDepth(TreeNode root) { Queue<TreeNode> queue=new LinkedList<>(); int res=0; if(roo...原创 2022-04-02 15:01:36 · 43 阅读 · 0 评论 -
力扣102. 二叉树的层序遍历
题目:给你二叉树的根节点root,返回其节点值的层序遍历。 (即逐层地,从左到右访问所有节点)。思路:栈维护class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res=new ArrayList<>(); Queue<TreeNode>...原创 2022-04-02 14:58:13 · 232 阅读 · 0 评论 -
力扣226. 翻转二叉树
题目:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。思路: 递归(自顶向下)终止条件:当前节点为null时返回 交换当前节点的左右节点,再递归的交换当前节点的左节点,递归的交换当前节点的右节点class Solution { public TreeNode invertTree(TreeNode root) { //递归函数的终止条件,节点为空时返回 if(root==null) { return null; } //下面三句...原创 2022-04-02 14:54:03 · 275 阅读 · 0 评论 -
力扣101. 对称二叉树
题目:给你一个二叉树的根节点root, 检查它是否轴对称。思路:设置递归函数,通过同步移动指针遍历并且比较这棵树,用p指针指向左子树的根节点,q指向右子树的根节点。递归比较p.left, q.right和p.right, q.left。其中(p==null&&q==null)时返回true;注意:一定要比较(p==null||q==null),不知道为啥不比较就出bug,有大佬说说吗。class Solution { public boo...原创 2022-04-01 19:22:54 · 237 阅读 · 0 评论 -
力扣98. 验证二叉搜索树
题目:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。思路:设置一个递归函数来递归判断,函数表示考虑以node为根的子树,判断子树中节点的值是否都在(min,max)之间。 在递归左子树时,左子树的值的节点都比根节点小,即:max设置为node.val;所有节点都比...原创 2022-04-01 18:55:50 · 67 阅读 · 0 评论 -
力扣96.不同的二叉搜索树
方法:动态规划思路:给定一个序列1....n,遍历每个数字i,将其作为根节点,将1.....(i-1)作为左子树,(i+1)....n作为右子树,则此时以i为根节点的种类由左子树和右子树的种类的笛卡儿积决定(左子树种类数量 * 右子树种类数量)。与此同时我们知道其中左右子树也可以以相同的方法递归构建它们的左右子树,并且以上的构建中根节点各不相同,所以能保证构建的每颗二叉树都是唯一的。 由此可见原问题可以分解成子问题,且子问题可以复用,所以...原创 2022-04-01 18:18:29 · 63 阅读 · 0 评论 -
力扣94.二叉树中序遍历
题目:给定一个二叉树的根节点root,返回它的中序遍历。题解:使用迭代思想(维护一个栈)概念:中序遍历:访问按照 左子树——根节点——右子树 的顺序遍历树方法:建立一个链表保存结果;建立一个栈来保存根节点:从而使得可以先遍历左子树,当左子树为空时,即可弹出栈中的根节点将其存入链表中,只后遍历此节点的右子树。class Solution { public List<Integer> inorderTraversal(Tre...原创 2022-04-01 16:22:24 · 391 阅读 · 0 评论