LeetCode
文章平均质量分 79
力扣刷题
爱敲代码的小黄
我是爱敲代码的小黄,阿里淘宝集团的Java开发工程师,CSDN博客专家,阿里云专家博主。写过的专栏:Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码系列、duubo源码系列,期待和大家一起学习,一起进步,一起对抗互联网寒冬
展开
-
【红海游戏】第 281 场力扣周赛复盘
大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,Java领域新星创作者。个人公众号:爱敲代码的小黄。系列专栏:Java设计模式、数据结构和算法。如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步。????如果感觉博主的文章还不错的话,请????三连支持????一下博主哦????博主正在努力完成2022计划中:以梦为马,扬帆起航,2022追梦人文章目录一、引言二、6012. 统计各位数字之和为偶数的整数个数1、题目简介2、题目解原创 2022-02-21 09:00:00 · 426 阅读 · 15 评论 -
随机取样已死,蓄水池抽样称王
最近小黄的朋友去一家业内有名的游戏公司面试,出了一道经典的题目:目前游戏需进行一项签到抽奖的活动,怎么保证每个人抽到奖品的概率都是相等的,保证最终中奖的人数为10人。原创 2022-01-18 10:08:40 · 3587 阅读 · 51 评论 -
图论的灵魂——带你走进迪杰斯特拉算法的世界
从前有一个小小的村庄,在村庄里面有许多的村民,这些村民有一个相同的爱好,他们喜欢每天去不同的人家串门,一起喝喝酒、打打牌。但最近他们有一个比较烦恼的问题,小A想去小D家,但怎么去才能让路程最短呢?毕竟,这个村庄每天有无数人来串门,如果能够找到一个路程最短的路线,能为这个村庄提供巨大的帮助。原创 2022-01-09 14:42:47 · 1246 阅读 · 39 评论 -
一文带你学会最小生成树,不要等到面试再临时抱佛脚了
普里姆算法(Prim算法),图论中的一种算法,通过点去找边的行为,可在加权连通图里搜索最小生成树。该算法于1930年由捷克数学家 沃伊捷赫·亚尔尼克 发现;并在1957年由美国计算机科学家 罗伯特·普里姆 独立发现原创 2021-12-05 14:30:57 · 703 阅读 · 1 评论 -
字节面试官让我讲讲最小生成树,我忍不住笑了
一、引言鸽了一周的我又回来了…大家有没有在生活中遇到这种事情你们县城需要在几个小区之间进行修路,由于政府资金紧张,不可能所有的小区之间都进行修路,而是修一条可以连接所有小区的路如同下图所示:当然,上述只是一个抽象化的例子,而我们实际生活中,每个小区间的距离也是不一样的,我们怎么使用最小的资金去连接所有的小区呢?这就牵扯到我们今天的老大哥们:Kruskal 算法和 Prim 算法这两种算法分别从边和点产生最小生成树,保证了资金的最小性本篇文章,我们一起走近 Kruskal 算法,探究一下该算原创 2021-11-28 13:46:54 · 610 阅读 · 0 评论 -
关键词匹配——HashMap已死,Trie树称王
你好,我是小黄,一名独角兽企业的Java开发工程师。感谢茫茫人海中我们能够相遇,俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习,希望优秀的你可以和我一起学习,一起努力,实现属于自己的梦想。文章目录一、引言二、何为关键词匹配三、何为Trie树四、为什么不直接使用HashMap五、Trie树的代码实现1、Trie的初始化2、Trie添加字符串3、Trie查询字符串出现的频率4、Trie删除字符串六、总结一、引言上周在公司的周会上,谈到这样一件事,对于风控行业来说,关键词匹配.原创 2021-11-14 17:35:26 · 1183 阅读 · 1 评论 -
暴力循环已死,牛顿迭代法称王
文章目录一、引言二、牛顿迭代法三、平方根四、代码实现一、引言今天在做力扣每日一题中,有一道题为:给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如 sqrt 。大名鼎鼎的求平方根,传说中的牛顿迭代法,本篇来看一下具体是怎么进行实现的吧!二、牛顿迭代法牛顿迭代法又称为牛顿-拉弗森方法,实际上是由牛顿、拉弗森(又是一个被牛顿大名掩盖的家伙)各自独立提出来的牛顿-拉弗森方法提出来的思路就是原创 2021-11-07 13:03:11 · 2332 阅读 · 9 评论 -
拓扑排序在顶尖风控团队的业务落地
一、引言上一章我们讲解了关于图的搜索方法,主要是深度优先搜索和广度优先搜索,两种方法的搜索方式各有优点不知道大家在日常工作中有没有碰到这种情况:比如,我们只有完成工作一之后,才能去完成工作二、工作三,当工作二和工作三同时完成时,我们的工作四才开始开始简单来说,当前工作必须依赖别的工作完成之后,才能实施工作,那么我们怎么判断哪一份工作需要提前完成呢?这就是我们今天要讲的 拓扑排序二、什么是拓扑排序在图论中,拓扑排序(Topological Sorting)是一个有向无环图的所有顶点的线性序列。原创 2021-10-31 17:12:35 · 344 阅读 · 4 评论 -
给我5分钟,带你秒杀所有图算法之DFS、BFS
一、前言上一篇文章我们提到了关于图的形象化描述方法,不知道大家还有没有印象。没有印象的话,可以去看一下上期的内容对于图来说,搜索的方法无外乎两种,深度优先搜索(DFS)和广度优先搜索(BFS)两种搜索算法也不太相同,今天我们就来看一下这两个搜索算法二、深度优先搜索我们一提到深度优先搜索,脑子里第一时间想到的就是递归没错,深搜就是依靠递归的方法来进行的搜索,我们来看一个例题:对于上图来说,使用深度优先搜索的路线为:0 -> 3 - > 2 -> 4 -> 5 ->原创 2021-10-17 15:43:30 · 284 阅读 · 0 评论 -
给我5分钟,带你秒杀所有图算法之图的对象化描述
这里是引用一、什么是图?图是我们现实生活中连接关系的抽象,例如朋友圈、微博的关注关系。简单抽象如下图所示:对于图来说,分为有向图和无向图,如下图所示:我们可以看出来,有向图代表只能从一个顶点到达另一个顶点,而无向图代表两个顶点之间可以相互到达。图1中,V4到达V1,而V1无法到达V4图2中,V4到达V1,V1也可以到达V4当然,还有一种图的形式,叫做:带权图(主要用来做一些路程、路费的计算),如下图所示:二、怎么存储一个图的结构?我们在刷题的时候,题目给我们的样例经常是这种.原创 2021-10-14 12:51:21 · 431 阅读 · 0 评论 -
给我三分钟,带你领略热血江湖中的并查集算法
你好,我是小黄,一名独角兽企业的Java开发工程师。校招收获数十个offer,年薪均20W~40W。感谢茫茫人海中我们能够相遇,俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习,希望优秀的你可以和我一起学习,一起努力,实现属于自己的梦想。文章目录一、什么是并查集二、深入理解并查集三、实现并查集四、真题训练五、路径压缩优化六、总结一、什么是并查集并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于处理一些不相交集合的合并问题,并支持两种操作:合并(Union).原创 2021-09-21 17:21:58 · 461 阅读 · 1 评论 -
【力扣每日一题:8-04】611. 有效三角形的个数【中等】
题目链接611. 有效三角形的个数题目简介给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。示例 1:输入: [2,2,3,4]输出: 3解释:有效的组合是: 2,3,4 (使用第一个 2)2,3,4 (使用第二个 2)2,2,3注意:数组长度不超过1000。数组里整数的范围为 [0, 1000]。题目解析第一次看见这个题目,脑海中第一个想法就是直接进行三次循环,进行判断,时间复杂度O(N^3)优化成O(N^2)的做法:先进行排序,原创 2021-08-04 22:10:21 · 194 阅读 · 0 评论 -
【LeetCode】909. 蛇梯棋
文章目录题目链接题目简介题目解析题目代码题目链接909. 蛇梯棋题目简介N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向。例如,一块 6 x 6 大小的棋盘,编号如下:r 行 c 列的棋盘,按前述方法编号,棋盘格中可能存在 “蛇” 或 “梯子”;如果 board[r][c] != -1,那个蛇或梯子的目的地将会是 board[r][c]。玩家从棋盘上的方格 1 (总是在最后一行、第一列)开始出发。每一回合,玩家需要从当前方格 x原创 2021-06-27 23:22:44 · 335 阅读 · 0 评论 -
【LeetCode】149. 直线上最多的点数
2021.6.24号每日一题文章目录题目链接题目简介题目解析题目代码题目链接149. 直线上最多的点数题目简介给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。示例 1:输入:points = [[1,1],[2,2],[3,3]]输出:3题目解析给定一些点,求哪些点在一条直线上常见的做法有两种:第一种:计算每个点和其他点的斜率比(y2 - y1)/ (x2 - x1),将斜率比按 .原创 2021-06-24 17:05:45 · 273 阅读 · 1 评论 -
【LeetCode】31. 下一个排列【中等】
题目链接31. 下一个排列【中等】题目简介实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]示例 2:输入:nums = [3,2,1]输出:[1,2,3]示例 3:输入:nums = [1,1,5]输出:[1,5,1]示例 4:输入:nums = [1]原创 2021-03-16 23:31:26 · 138 阅读 · 0 评论 -
【力扣每日一题:2-20】697. 数组的度【简单】
文章目录题目链接题目简介题目解析题目代码个人做法官方做法题目链接697. 数组的度【简单】题目简介给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。示例 1:输入:[1, 2, 2, 3, 1]输出:2解释:输入数组的度是2,因为元素1和2的出现频数最大,均为2.连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1, 2,原创 2021-02-20 22:04:50 · 216 阅读 · 0 评论 -
【力扣每日一题:2-19】1004. 最大连续1的个数 III【中等】
题目链接1004. 最大连续1的个数 III题目简介给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。示例 1:输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6解释: [1,1,1,0,0,1,1,1,1,1,1]粗体数字从 0 翻转到 1,最长的子数组长度为 6。实例2:输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1],原创 2021-02-19 21:46:41 · 350 阅读 · 0 评论 -
【LeetCode】1423. 可获得的最大点数
1. 题目简介2. 题目分析题目的意思要求你从数组的最左边或者最右边取出k个数字,取出的数字和最大我们可以换个角度来思考:当我们取出k个数字后,剩余的 len - k 个数字是不是一个连续的数组?如果我们求出连续数组的最小值,是不是相当于取出的数字和最大所以,我们将这个问题转化为给定一个数组,我们求在一段区间内的最小值使用滑动窗口进行解决3. 代码分析class Solution { public int maxScore(int[] cardPoints, int k) {原创 2021-02-06 00:55:31 · 245 阅读 · 0 评论 -
【力扣每日一题/04】57. 插入区间
C#中对于list的取值,直接使用:list[i]1. 题目描述2. 题目分析intervals 代表初始的区间,newInterval 代表了想要插入的区间如果 intervals 的左边界大于 newInterval[1]:list.Add(new int[] { intervals[i][0], intervals[i][1] });如果 intervals 的右边界小于 newInterval[0]:list.Add(new int[] { intervals[i][0], .原创 2020-11-05 21:13:34 · 198 阅读 · 0 评论 -
【力扣每日一题/03】941. 有效的山脉数组
题目等级为简单,做起来可真是一言难尽1. 题目描述2. 题目描述搞清楚山脉数组的定义:长度大于等于3且先升序再降序【重复的值直接false】先判断一个数组是否升序:i + 1 < N && A[i] < A[i + 1]如果当前i == 0 || i == A.Length,没有升序或降序序列,直接返回 false再判断是否降序:i + 1 < N && A[i] > A[i + 1]如果最后i == A.Length - 1 返.原创 2020-11-03 20:56:51 · 225 阅读 · 0 评论 -
【力扣每日一题/02】349. 两个数组的交集
C#字典的键值对遍历:foreach (KeyValuePair<int, int> kvp in dic)1. 题目描述2. 题目分析给你两个数组,让你求两个数组的交集【输出结果是唯一的】首先,对于数组num1进行Dictionary遍历,不存在dic.Add(nums1[i], 1);,存在dic[nums1[i]] = 1;继而,对于数组num2进行Dictionary遍历,dic[nums2[i]]++:将重复的标记为2 dic.ContainsKey(nums2[i].原创 2020-11-03 20:44:19 · 268 阅读 · 0 评论 -
【力扣每日一题】129. 求根到叶子节点数字之和
不得不说,憨憨脑袋没有递归~~~1. 题目描述2. 题目分析题目意思很简单,遍历树的每一条路径,然后相加,返回最后结果思路一:DFS【每次看代码就秒懂,自己每次都想不到】:递递归归,莫有脑袋。每次递归加上从一开始的值思路二:BFS【个人最喜欢的】:维护两个队列,队列一存放root,队列二存放val,每次遍历抛出,队列二种始终更新这一条分树的值,最后相加3. 题目代码3.1 DFSpublic int sumNumbers(TreeNode root) { return dfs(r.原创 2020-10-29 20:55:19 · 292 阅读 · 0 评论 -
【力扣每日一题】1207. 独一无二的出现次数
没想到C#的修改value值,可以直接 dis[key] = value 进行修改~~~1. 题目描述2. 题目分析每个数字在数组中出现的次数是独一无二的思路一:桶排,看了看数据范围,挺小,可以桶排思路二:字典(HashMap),最后Value都是等于1的返回true3. 题目代码 public static bool UniqueOccurrences(int[] arr) { Dictionary<int, int> dic =.原创 2020-10-28 19:02:32 · 202 阅读 · 0 评论 -
【力扣每日一题】144. 二叉树的前序遍历
1. 题目描述2. 题目解析非常典型的一道二叉树题目思路一:递归求解思路二:迭代求解3. 题目代码3.1 递归**public IList<int> PreorderTraversal(TreeNode root) { List<int> list = new List<int>(); Tree(root, list); return list; }原创 2020-10-27 12:49:42 · 210 阅读 · 0 评论 -
【力扣每日一题】1365. 有多少小于当前数字的数字
1. 题目描述2. 题目思路给定一个数组,让你返回每个数值数组中比他小的个数思路一:直接暴力,两次for循环,出结果思路二:快速排序,prev == -1 || data[i][0] != data[i - 1][0],如果当前的数值不等于前面的数值的话,说明不重复,进行ret[data[i][1]] = prev;思路三:桶排序,一遍循环放桶中,一遍循环求下前缀和,最后一遍得出结果注意:因为该题目指定了规定的数据区间3. 题目代码 public static int[] Smalle原创 2020-10-26 16:25:58 · 197 阅读 · 0 评论 -
【力扣每日一题】925. 长按键入
1. 题目描述2. 题目分析可恶的模拟题~使用两个指针,一个指针l1指向name,一个指针l2指向typed如果当前的name[l1]与typed[l2]相等,则l1++/l2++,如果不相等的话,则判断typed[l2]是否等于typed[l2-1],不相等直接但会false最后判断下当前的l1是不是等于name,length,验证一下l1是否完全匹配完整3. 题目代码 public static bool IsLongPressedName(string name, string t原创 2020-10-21 22:00:16 · 300 阅读 · 0 评论 -
【二分查找】左侧边界、右侧边界、查找值
一直以来,搞不清楚关于二分查找的边界问题,不是这里越界,就是那里越界,调试很久也可能A不了,今天,来总结一下关于二分查找1. 查找值对于查找特定值来说,算是二分法的模板题目吧。public int select(int[] nums, int target){2. 左侧边界3. 右侧边界...原创 2020-08-31 20:42:07 · 3155 阅读 · 1 评论 -
【腾讯】环形链表(证明环的位置)
1. 题目描述题目链接:环形链表II2. 题目分析题目在上一个环形链表上让你证明有环无环,进而让你求此环点首先,我们想想,在上一题中,我们快指针走2步,慢指针走一步,也就是快指针 = 2 * 慢指针快指针比慢指针多走了nb,最后交汇在环中的某一点由上述式子相减慢指针走的步数 = nb所以,我们考虑考虑,我们怎么才能让慢指针走到环点呢?当慢指针走a+nb时,是不是就走到环点了所以,我们只需要再让慢指针走a步,也就是从头再定义一个指针,当两指针相交时,此节点就是该环点或者利用原创 2020-08-17 21:02:39 · 522 阅读 · 0 评论 -
【腾讯】环形链表(证明有环)
1. 题目描述题目链接:环形链表2. 题目解析对于这种问题,最好的做法是~~~~做过一遍~ _ ~简单来说,定义两个指针,一个快指针,一个慢指针,如果他们能够相遇的话,就代表该链表有环,否则如果快指针走到了null,则证明无环。这里说明下关于有环的证明:我们的快指针走2步,慢指针走1步,快指针会先在环里进行循环走,等到慢指针也走进环里时。根据速度的相对,如果以满指针为参考系的话,快指针一次走一步,迟早会追上慢指针。3. 题目代码public class Solution { pu原创 2020-08-17 20:35:39 · 574 阅读 · 0 评论 -
数据结构实验之链表八:Farey序列
数据结构实验之链表八:Farey序列Time Limit: 10 ms Memory Limit: 600 KiBSubmit StatisticProblem DescriptionFarey序列是一个这样的序列:其第一级序列定义为(0/1,1/1),这一序列扩展到第二级形成序列(0/1,1/2,1/1),扩展到第三极形成序列(0/1,1/3,1/2,2/3,1/1),扩展到第四...原创 2018-09-26 20:13:49 · 152 阅读 · 0 评论 -
数据结构实验之链表九:双向链表
数据结构实验之链表九:双向链表Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit StatisticProblem Description学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内存中找到下一个位置,这是一个不会轻易断裂的链。但单链表有一个弱点——不能回指。比如在链表中有两个节点A,B,他们的关系是B是A...原创 2018-09-26 20:13:12 · 757 阅读 · 0 评论 -
数据结构实验之链表七:单链表中重复元素的删除
数据结构实验之链表七:单链表中重复元素的删除Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit StatisticProblem Description按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。Input第一行输入元素个数 n (1 <= n <...原创 2018-09-26 20:12:29 · 230 阅读 · 0 评论 -
数据结构实验之链表六:有序链表的建立
数据结构实验之链表六:有序链表的建立Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit StatisticProblem Description输入N个无序的整数,建立一个有序链表,链表中的结点按照数值非降序排列,输出该有序链表。Input第一行输入整数个数N;第二行输入N个无序的整数。Output依次输出有序链表的...原创 2018-09-26 20:11:40 · 189 阅读 · 0 评论 -
数据结构实验之链表五:单链表的拆分
数据结构实验之链表五:单链表的拆分Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit StatisticProblem Description输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。Input第一行输入整数N...原创 2018-09-26 20:10:58 · 623 阅读 · 0 评论 -
数据结构实验之链表三:链表的逆置
数据结构实验之链表三:链表的逆置Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit StatisticProblem Description输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据。Input输入多个整数,以-1作为结束标志。Output输出...原创 2018-09-26 20:10:06 · 232 阅读 · 0 评论 -
数据结构实验之链表二:逆序建立链表
数据结构实验之链表二:逆序建立链表Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit StatisticProblem Description输入整数个数N,再输入N个整数,按照这些整数输入的相反顺序建立单链表,并依次遍历输出单链表的数据。Input第一行输入整数N;;第二行依次输入N个整数,逆序建立单链表。Output...原创 2018-09-26 20:09:22 · 195 阅读 · 0 评论 -
数据结构实验之链表一:顺序建立链表
数据结构实验之链表一:顺序建立链表Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit StatisticProblem Description输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。Input第一行输入整数的个数N;第二行依次输入每个整数。Output输出这组整数。Samp...原创 2018-09-26 20:08:41 · 349 阅读 · 0 评论 -
数据结构实验之链表四:有序链表的归并
数据结构实验之链表四:有序链表的归并Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit Statistic DiscussProblem Description分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。Input第一行输...原创 2018-09-12 11:54:52 · 212 阅读 · 0 评论 -
3n+1数列问题
3n+1数列问题Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit StatisticProblem Description有一天小标遇到了经典的3n+1数链问题,他想知道3n+1数链的前k个数是多少。下面小标来给你介绍一下3n+1数链是什么,给定一个数n,如果n为偶数,那么下一个数n1 = n / 2;否则n1 = 3 * n...原创 2018-09-12 11:04:32 · 906 阅读 · 0 评论 -
数学链表
数学链表Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit Statistic DiscussProblem DescriptionFish 得到了一个神奇的数学链表,链表上每个节点有一个值,并且想要往这个链表中插入数据。但是这个是一个很神奇的数学链表,插入的时候有一个特定的规则,插入时给出一个 x 和 k,让当前链表所有值为 x...原创 2018-09-11 21:13:48 · 399 阅读 · 0 评论