算法
文章平均质量分 79
红颜莫知己
这个作者很懒,什么都没留下…
展开
-
前k个高频单词
692. 前K个高频单词给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。示例 1:输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2输出: [“i”, “love”]解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。注意,按字母顺序 “i” 在 “love” 之前。示例 2:输入: [“the”, “da原创 2021-05-20 10:39:56 · 309 阅读 · 1 评论 -
剑指offer_替换空格
目录题目描述方法一:StringBuilderjava代码:方法二:字符串数组char[]java代码:方法三:replace()库函数题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。示例:输入:“We Are Happy”返回值:“We%20Are%20Happy”方法一:StringBuilder我们可以将字符串s都重新拼接StringBuilder中,因为后者原创 2021-05-17 21:25:59 · 267 阅读 · 0 评论 -
二叉树的堂兄弟节点
目录993. 二叉树的堂兄弟节点思路分析DFSBFS993. 二叉树的堂兄弟节点在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。示例 1:输入:root = [1,2,3,4], x = 4, y =原创 2021-05-17 09:09:06 · 1188 阅读 · 8 评论 -
剑指offer 03.数组中重复的数字
目录找出数组中重复的数字。思路分析方法一:Setjava代码:复杂度分析时间复杂度空间复杂度方法二 :原地交换java代码找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3思路分析方法一:Set看到重复两个字我们一定要想起HashSet这个数据结构,它是基于Ha原创 2021-05-15 19:41:14 · 125 阅读 · 1 评论 -
罗马数字转整数
13. 罗马数字转整数罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V原创 2021-05-15 09:49:30 · 236 阅读 · 0 评论 -
整数转罗马数字(详解+图解)
目录12. 整数转罗马数字贪心算法思路分析java代码:复杂度分析时间复杂度空间复杂度暴力匹配法思路分析java代码复杂度分析时间复杂度空间复杂度12. 整数转罗马数字罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000原创 2021-05-14 08:54:18 · 1653 阅读 · 7 评论 -
制作m束花所需的最少天数
目录1482. 制作 m 束花所需的最少天数思路分析java代码(详细注释)1482. 制作 m 束花所需的最少天数给你一个整数数组 bloomDay,以及两个整数 m 和 k 。现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。示例 1:输入:bloomDay = [1,10,3,10,原创 2021-05-09 09:59:23 · 228 阅读 · 0 评论 -
打家劫舍(动态规划)
198. 打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:原创 2021-05-06 09:29:44 · 199 阅读 · 0 评论 -
解码异或后的数组
目录1720. 解码异或后的数组思路分析什么是异或案例分析java代码1720. 解码异或后的数组未知 整数数组 arr 由 n 个非负整数组成。经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。请解码返回原数组 arr原创 2021-05-06 08:26:43 · 290 阅读 · 1 评论 -
砖墙(HashMap)
554. 砖墙你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和应该相等。你现在要画一条 自顶向下 的、穿过 最少 砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。给你一个二维数组 wall ,该数组包含这堵墙的相关信息。其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量原创 2021-05-02 11:11:49 · 144 阅读 · 0 评论 -
员工的重要性(DFS和BFS)
690. 员工的重要性给定一个保存员工信息的数据结构,它包含了员工 唯一的 id ,重要度 和 直系下属的 id 。比如,员工 1 是员工 2 的领导,员工 2 是员工 3 的领导。他们相应的重要度为 15 , 10 , 5 。那么员工 1 的数据结构是 [1, 15, [2]] ,员工 2的 数据结构是 [2, 10, [3]] ,员工 3 的数据结构是 [3, 5, []] 。注意虽然员工 3 也是员工 1 的一个下属,但是由于 并不是直系 下属,因此没有体现在员工 1 的数据结构中。现在输入一个原创 2021-05-01 22:06:25 · 667 阅读 · 0 评论 -
动态规划算法:没有冗杂的概念,超简单,超容易理解
目录前言什么是动态规划?动态规划的解题步骤斐波那契数列思路分析java代码:leetCode377. 组合总和 Ⅳ思路分析(一定要仔细看)java代码:前言在这里我只想说一句,希望读者可以仔细看,看完博主可以保证,你一定会做题。什么是动态规划?动态规划(Dynamic Programing),简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。或许有人连重叠子问题是什么都不知道,就是重复的计算,我们举个很简单例子说明一下:我们都知道斐波那契数列用递归算法得到的,我们画出图示这样的原创 2021-04-24 18:38:45 · 290 阅读 · 1 评论 -
组合总和 Ⅳ(超详细讲解)
leetCode377. 组合总和 Ⅳ给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。示例 1:输入:nums = [1,2,3], target = 4输出:7解释:所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。原创 2021-04-24 18:38:23 · 532 阅读 · 0 评论 -
完全二叉树的节点数
目录Leecode.222完全二叉树的节点数思路分析层序遍历_迭代递归_二叉树的遍历迭代_二叉树的遍历Leecode.222完全二叉树的节点数给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例 1:输入:root = [1,2,3,4,5,6]输出:6示例 2:输入:root原创 2021-04-20 10:02:39 · 2782 阅读 · 0 评论 -
树的最大深度和最小深度(java)
目录树的深度和高度二叉树的最大高度思路分析递归迭代N叉树的最大深度LeetCode.559.N叉树的最大深度思路分析递归迭代树的深度和高度什么是树的深度?什么是树的高度,一张图让你弄明白!我们暂时以二叉树为例。二叉树的最大高度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。思路分析我们在做每一道关于二叉树的题时,都要原创 2021-04-20 09:13:53 · 2407 阅读 · 0 评论 -
贪心算法:摆动序列
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。原创 2021-04-16 15:32:49 · 461 阅读 · 0 评论 -
贪心算法简述
贪心算法什么是贪心算法贪心的本质是选择每一阶段的局部最优,从而达到全局最优我们举个例子,方便理解:假设这里有十张钞票,你从中拿走五张,如果想拿到的钱数额最大,再怎么拿?我们每次都拿最大面额的钞票,这就是局部最优;最后我们拿到的钞票数额就是最大的,这就是全局最优;由局部最优推出全局最优。就这就贪心算法最基本的思想贪心没有套路很多同学想问,做题想不出是贪心算法,有没有什么办法或者套路,一眼就看出了要是用贪心算法。抱歉,没有就比如上述例题,其实我们不需要知道这种拿法是贪心算法我们都能想原创 2021-04-16 14:05:43 · 292 阅读 · 0 评论 -
对称二叉树
226. 翻转二叉树翻转一棵二叉树。示例:输入:输出:这是一道非常简单题,就是对二叉树遍历的考察,但在这里有一个问题,那就是我们使用哪种遍历方式呢?很多人程序过了,却不知道自己使用的是哪种遍历方式,递归...原创 2021-04-15 10:03:32 · 839 阅读 · 0 评论 -
十大排序图示详解(java代码)
目录一、冒泡排序原理图解java代码:二、插入排序原理图解java代码:三、选择排序原理图解Java代码:四、快速排序原理图解Java代码:五、归并排序原理图解java代码:六、堆排序七、桶排序原理图解java代码:八、基数排序一、冒泡排序原理冒泡排序就是将相邻的两个元素进行比较,如果前者大于后者(反之降序),则交换,反之不交换。图解第一轮将最大值放在最后一位,第二轮将次大值防在倒数第二位java代码:public void bubblingSort(int[] nums) {原创 2021-04-13 19:31:51 · 276 阅读 · 2 评论 -
二叉树的层序遍历
二叉树的层序遍历我们回归正题,什么是二叉树的层序遍历,就是将二叉树分层,每一层从左至右输出,如图所示输出结果为乍眼一看和广度优先搜索(BFS)没什么区别,但是层序遍历要求输出结果与BFS不同,层序遍历要求我们区分每一层,就是返回一个二维数组。LeetCode102. 二叉树的层序遍历给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],返回其层序遍历结果:我这道题中我们需要用到队列原创 2021-04-07 16:48:30 · 1719 阅读 · 8 评论 -
二叉树的中序遍历
目录简述LeetCode94. 二叉树的中序遍历递归迭代法简述二叉树的中序遍历的遍历顺序就是左根右那到底什么是左根右我们从A节点看;A节点的左节点为B,右节点为C,根据 “左根右” ,做节点存在,我们看向左节点B;此时我们将B节点看成根节点,它的左节点不存在右节点为E,那么根据“左右根”,“左”不存在,所以不输出,那么就该输出“根”,即B;再输出“右”,即E;我们再将E看为根节点,根据“左根右”,它的左节点不存在,不输出“左”,“根”存在,输出根E,“右”不存在,不输出。A的“左”输出完成了原创 2021-04-06 16:45:20 · 1538 阅读 · 0 评论 -
二叉树的前序遍历
前言在讲二叉树的遍历之前,我们首先讲一下递归这个东西,很多人,写递归函数靠运气,或者说不只是写递归函数,写任何代码都靠运气,听天由命,有时候自己都不知道自己写的是什么就过了,这样写代码肯定是不行的。之所以我们会有这种情况是因为,我们在写一个代码的时候没有一个明确的方法体,我们在这里以递归为例子。递归我们在写递归算法的时候主要有三要素,每次写递归按照这三要素写,一般不会出错。1.确定递归函数的参数和返回值: 确认哪些参数是递归过程中需要处理的,那么就在递归函数里加上这个参数,返回值每次递归的返回值一原创 2021-04-06 09:48:06 · 6063 阅读 · 2 评论 -
堆排序:大顶堆和小顶堆 + 前K个高频元素
这里写目录标题一、堆排序小顶堆举个栗子大顶堆二、前K个高频元素思路分析三、大顶堆小顶堆代码解析一、堆排序要了解大顶堆和小顶堆,我们先简单了解一下堆排序。堆排序(Heapsort)是指利用堆这种数据结构设计的一种排序算法,堆积是一个近似完全二叉树的结构,并同时满足堆积的特性:子节点的键值或者所以总是大于或大于它的父节点(注意:父节点的左节点不一定大于右节点)。它是一种选择排序,最好、最坏、平均时间复杂度都是O(nlogn),他也是不稳定排序。我们还要注意的一点是,我们在学习编程的时候最好把英文名字都原创 2021-03-30 16:02:54 · 1223 阅读 · 2 评论 -
逆波兰表达式求值
150. 逆波兰表达式求值(点击立即答题)根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入:tokens = [“2”,“1”,"+",“3”,"*"]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:输入:tokens = [“4”,“13原创 2021-03-28 16:22:10 · 2365 阅读 · 9 评论 -
删除字符串中所有相邻重定项
1047. 删除字符串中的所有相邻重复项(点击立即答题)给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:“abbaca”输出:“ca”解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,原创 2021-03-28 11:00:17 · 385 阅读 · 1 评论 -
环形链表II + 题解和图示
环形链表 II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例 1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中.原创 2021-03-25 14:32:37 · 354 阅读 · 0 评论 -
反转字符串里的单词 + 图示
翻转字符串里的单词给定一个字符串,逐个翻转字符串中的每个单词。说明:无空格字符构成一个 单词 。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。示例 1:输入:“the sky is blue”输出:“blue is sky the”示例 2:输入:" hello world! "输出:“world! hello”解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。.原创 2021-03-25 10:15:49 · 1464 阅读 · 0 评论 -
剑指 Offer 05. 替换空格 三种方法
剑指 Offer 05. 替换空格(点击立即答题)请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”限制:0 <= s 的长度 <= 10000这是一道非常简单的题,简单题有简单题的要求,就是尽可能时间快,内存使用少,有的面试就喜欢考这种,每个人都会做,但是总有一些人的做法不一样,那样更快,内存占用更少。解题思路:1.创建一个字符类型数组aar,在最坏的情况下,字符串s全原创 2021-03-24 16:16:32 · 151 阅读 · 0 评论 -
反转字符串Ⅱ
反转字符串 II(点击进去答题)给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。示例:输入: s = “abcdefg”, k = 2输出: “bacdfeg”提示:该字符串只包含小写英文字母。给定字符串的长度和 k 在 [1, 10000] 范围内。思路分析:很多人读完这道题都不知道什么意思.原创 2021-03-24 12:25:33 · 163 阅读 · 1 评论 -
反转字符串 + 反转链表
链表什么是链表,链表是一种通过指针串联在一起的线下结构,每个节点是由两部分组成的,一个是数据域,一个是指针域,指针域是存放下一个节点的指针,最后一个节点的指针域指向null。单链表双链表双链表和单链表唯一的不同点就是,双链表有俩个指针域,一个指向上一个节点,一个指向下一个节点,既可以向前查,也可以向后查。还有循环链表就是链表里面有个环,很容易想象的,就不在这里图示了。链表的存储结构链表是通过指针域的指针链接在内存的各个节点,所以链表在内存中不是连续分别的,而是散乱分布到内存的某个地址上,分原创 2021-03-22 17:29:04 · 274 阅读 · 0 评论 -
三数之和 + 双指针 + 四数之和
三数之和(https://leetcode-cn.com/problems/3sum/)给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:.原创 2021-03-22 15:28:47 · 181 阅读 · 0 评论 -
赎金信 + 数组在哈希法中的应用 + 有效的字母异位词
赎金信给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)示例 1:输入:ransomNote = “a”, magazine = “b”输出:false示例 2:输入:ransomNote原创 2021-03-22 09:33:02 · 137 阅读 · 2 评论 -
快乐数
Leetcode 202.快乐数快乐数编写一个算法来判断一个数 n 是不是快乐数。快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 true ;不是,则返回 false 。示例 1:输入:19输出:true解释:12 + 92 = 82(这里的每个2代表平方的意思)82 + 22 = 6862 + 82 =原创 2021-03-19 09:07:43 · 227 阅读 · 3 评论 -
四数之和 II ,HashMap图解
454. 四数之和 II给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。例如:输入:A = [ 1, 2]B = [-2,-1]C = [-1, 2]D = [ 0, 2]输出:2原创 2021-03-19 15:44:26 · 146 阅读 · 0 评论 -
两数之和
两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target = 6输出:[1,原创 2021-03-19 11:04:19 · 138 阅读 · 1 评论