无尽算法系列
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
静谧之心
专业摩的佬
业余吉他手
退役喷子
展开
-
什么是指针回拨? 优化snowflake指针回拨的缺陷(不引入任何第三方中间件(redis, zk))
首先简单了解下, 什么是指针回拨?很多普遍的唯一ID算法, 例如雪花算法, 他们算法是根据本机的机器码, 还有本机时间得出的, 他们对本机的时间是强依赖的.服务器的硬件时钟的时间存在误差, 需要例如ntp服务来进行的自我校准,在回拨的期间, 这段时间是已经被ID生成算法使用过的, 也就变成了二手时间, 这个二手时间, 可能导致了我们再次计算ID时, 我们的参数因子都是相同的, 最终导致了生成完全重复的ID.那么怎么避免呢?等待这个二手时间过去(因为回拨时间大概率不会太长)侦测二手时间段,原创 2021-04-19 15:55:26 · 5220 阅读 · 3 评论 -
无尽算法之 132模式
给定一个整数序列:a1, a2, …, an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。注意:n 的值小于15000。示例1:输入: [1, 2, 3, 4]输出: False解释: 序列中不存在132模式的子序...原创 2020-02-14 07:50:58 · 482 阅读 · 0 评论 -
无尽算法之 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null...原创 2020-02-12 11:29:30 · 521 阅读 · 0 评论 -
无尽算法之 LRU缓存机制 (LinkedHashMap)
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数...原创 2020-02-11 10:02:01 · 492 阅读 · 0 评论 -
无尽算法之 重新排列日志文件 (PriorityQueue)
你有一个日志数组 logs。每条日志都是以空格分隔的字串。对于每条日志,其第一个字为字母数字标识符。然后,要么:标识符后面的每个字将仅由小写字母组成,或;标识符后面的每个字将仅由数字组成。我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。将日志重新排序,使得所有字母日志都排在数字日志之前。字母日志按内容字母顺序排序,忽略标识符;在内容相同时,按标识符排序...原创 2020-02-11 06:17:30 · 360 阅读 · 0 评论 -
无尽算法之 两数之和2 (双指针)
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], targe...原创 2020-02-11 05:01:03 · 353 阅读 · 0 评论 -
无尽算法之 删除排序数组中的重复项 (快慢双指针)
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums ...原创 2020-02-10 16:34:48 · 442 阅读 · 1 评论 -
无尽算法之 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路:先构造一个虚拟头节点,同时遍历两个链表,小的插入到虚拟头结点后面注意将剩下的链表插入最后最后返回 虚拟头节点.next;题解:/** * De...原创 2020-02-10 10:07:30 · 332 阅读 · 0 评论 -
无尽sql之 删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。IdEmail1john@example.com2bob@example.com3john@example.comId 是这个表的主键。例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:IdEmail...原创 2020-02-09 16:26:56 · 3223 阅读 · 0 评论 -
无尽算法之 杨辉三角 (类似动态规划)
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 5输出:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]思路:直接迭代, 类似动态规划, 具体看代码题解:class Solution { public Lis...原创 2020-02-09 15:24:15 · 343 阅读 · 0 评论 -
无尽算法之 二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:[ [15,7], [9,20], [3]]思路:基本的 dfs 层次遍历题解:/*...原创 2020-02-09 13:27:42 · 307 阅读 · 0 评论 -
无尽算法之 字符的最短距离
给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。示例 1:输入: S = “loveleetcode”, C = ‘e’输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]说明:3字符串 S 的长度范围为 [1, 10000]。C 是一个单字符,且保证是字符串 S 里的字符。S 和 C ...原创 2020-02-09 08:39:07 · 400 阅读 · 0 评论 -
无尽算法之 反转链表 (递归版)
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL思路:假设链表是[1, 2, 3, 4, 5]从最底层最后一个reverseList(5)来看返回了5这个节点reverseList(4)中p为5head.next.next = head 相当于 5 -&...原创 2020-02-09 06:15:16 · 445 阅读 · 0 评论 -
无尽算法之 重复的字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: “abab”输出: True解释: 可由子字符串 “ab” 重复两次构成。示例 2:输入: “aba”输出: False示例 3:输入: “abcabcabcabc”输出: True解释: 可由子字符串 “abc” 重复四次构成。 (或者...原创 2020-02-08 07:38:43 · 372 阅读 · 0 评论 -
无尽算法之 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的...原创 2020-02-08 06:19:58 · 473 阅读 · 0 评论 -
无尽算法之 第三大的数 (红黑树版本)
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。示例 1:输入: [3, 2, 1]输出: 1解释: 第三大的数是 1.示例 2:输入: [1, 2]输出: 2解释: 第三大的数不存在, 所以返回最大的数 2 .示例 3:输入: [2, 2, 3, 1]输出: 1解释: 注意,要求返回第三大的数,是指第三大且唯一...原创 2020-02-06 09:56:33 · 244 阅读 · 0 评论 -
无尽算法之 找到字符串中所有字母异位词 (经典滑动窗口算法)
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。说明:字母异位词指字母相同,但排列不同的字符串。不考虑答案输出的顺序。示例 1:输入:s: “cbaebabacd” p: “abc”输出:[0, 6]解释:起始索引等于 0 的子串是 “c...原创 2020-02-06 09:29:45 · 283 阅读 · 0 评论 -
无尽算法之 计数质数(厄拉多塞筛法)
统计所有小于非负整数 n 的质数的数量。示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。思路:厄拉多塞筛法注意这里true false 意义是反过来的题解:class Solution { public int countPrimes(int n) { boolean[] isPrime = new ...原创 2020-02-06 06:16:24 · 509 阅读 · 0 评论 -
无尽算法之 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。案例:s = “leetcode”返回 0.s = “loveleetcode”,返回 2.注意事项:您可以假定该字符串只包含小写字母。思路:遍历两次map 映射次数遍历到 1 立刻返回index题解:class Solution { public int firstUniqC...原创 2020-02-06 06:11:43 · 163 阅读 · 0 评论 -
无尽算法之 最常见的单词
给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。题目保证至少有一个词不在禁用列表中,而且答案唯一。禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。题目保证至少有一...原创 2020-02-06 05:40:12 · 249 阅读 · 0 评论 -
无尽算法之 最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minS...原创 2020-02-05 12:00:38 · 2590 阅读 · 0 评论 -
无尽算法之 下一个更大的元素2 (单调栈)
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 ...原创 2020-02-05 11:07:21 · 247 阅读 · 0 评论 -
无尽算法之 股票价格跨度(单调栈+HashMap)
编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。示例:输入:[“StockSpanner”,“...原创 2020-02-05 11:01:58 · 569 阅读 · 0 评论 -
无尽算法之 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]思路:dfs, 传递参数为深度, 按照深度插入list题解:/** * Definit...原创 2020-02-05 04:56:35 · 223 阅读 · 0 评论 -
无尽算法之 设计推特(简单解法和最优解法)
设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。你的设计需要支持以下的几个功能:postTweet(userId, tweetId): 创建一条新的推文getNewsFeed(userId): 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户自己发出的。推文必须按照时间顺序由最近的开始排序。fol...原创 2020-02-04 09:37:18 · 627 阅读 · 0 评论 -
无尽算法之 检查一个数是否在数组中占绝大多数
给出一个按 非递减 顺序排列的数组 nums,和一个目标数值 target。假如数组 nums 中绝大多数元素的数值都等于 target,则返回 True,否则请返回 False。所谓占绝大多数,是指在长度为 N 的数组中出现必须 超过 N/2 次。示例 1:输入:nums = [2,4,5,5,5,5,5,6,6], target = 5输出:true解释:数字 5 出现了 5 次,...原创 2020-02-03 07:41:52 · 320 阅读 · 0 评论 -
无尽算法之 N叉树的最大深度
给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。例如,给定一个 3叉树 :我们应返回其最大深度,3。说明:树的深度不会超过 1000。树的节点总不会超过 5000。思路:dfs递归, 层深度替换最大深度题解:/*// Definition for a Node.class Node { public int val;...原创 2020-02-02 06:29:59 · 252 阅读 · 0 评论 -
无尽算法之 翻转游戏
你和朋友玩一个叫做「翻转游戏」的游戏,游戏规则:给定一个只有 + 和 - 的字符串。你和朋友轮流将 连续 的两个 “++” 反转成 “–”。 当一方无法进行有效的翻转时便意味着游戏结束,则另一方获胜。请你写出一个函数,来计算出每个有效操作后,字符串所有的可能状态。示例:输入: s = “++++”输出:[“–++”,“±-+”,“+±-”]注意:如果不存在可能的有效操作,请返回...原创 2020-02-01 11:34:17 · 452 阅读 · 0 评论 -
无尽算法之 从简单例子 一步一步倒推 深入浅出动态规划算法的原理(呕心沥血版)
题目: 给定一个正整数s, 判断一个数组arr中,是否有一组数字加起来等于s。思路:普通递归法:还是老套路, 每个数字都有两种可能, 选和不选, 递归搞定, 注意2个跳出条件, 其中arr[i]>s 这个条件可有可无, 只是为了避免不必要的计算, 但是注意, 这个条件在递归中无所谓, 在迭代的动态规划中, 如果去除此条件, 注意防止数组越界, 同时将该位置置为false.动态规划法:...原创 2020-01-30 08:43:57 · 2718 阅读 · 0 评论 -
无尽算法之 一个简单小示例 掌握动态规划算法!
题目: 在一个数组arr中,找出一组不相邻的数字,使得最后的和最大。思路:还是老套路, 每个数字都有两种可能, 选和不选, 递归搞定.但是, 我们会发现递归的时候时间复杂度是呈指数上升的(log2^2),我们会发现, 很多的子问题, 在普通递归中是被重复计算的, 所以我们需要将每一步的计算结果保存起来, 这样在上层方法利用到下层方法的计算结果时, 可以直接去拿而不需要重复计算, 我们一般使...原创 2020-01-29 13:15:37 · 339 阅读 · 0 评论 -
五大常用算法之一:动态规划算法
五大常用算法之一:动态规划算法一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的...转载 2020-01-29 11:45:52 · 440 阅读 · 0 评论 -
无尽SQL之 游戏玩法分析 I
活动表 Activity:Column NameTypeplayer_idintdevice_idintevent_datedategames_playedint表的主键是 (player_id, event_date)。这张表展示了一些游戏玩家在游戏平台上的行为活动。每行数据记录了一名玩家在退出平台之前,当天使用同一台设备登录平台后打开的...原创 2020-01-29 07:12:29 · 444 阅读 · 0 评论 -
无尽算法之 山脉数组的峰顶索引
我们把符合下列属性的数组 A 称作山脉:A.length >= 3存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < ... A[i...原创 2020-01-29 06:43:22 · 269 阅读 · 0 评论 -
无尽SQL之 订单最多的客户
在表 orders 中找到订单数最多客户对应的 customer_number 。数据保证订单数最多的顾客恰好只有一位。表 orders 定义如下:ColumnTypeorder_number (PK)intcustomer_numberintorder_datedaterequired_datedateshipped_datedate...原创 2020-01-28 11:09:50 · 1309 阅读 · 0 评论 -
无尽算法之 日志速率限制器
请你设计一个日志系统,可以流式接收日志以及它的时间戳。该日志会被打印出来,需要满足一个条件:当且仅当日志内容 在过去的 10 秒钟内没有被打印过。给你一条日志的内容和它的时间戳(粒度为秒级),如果这条日志在给定的时间戳应该被打印出来,则返回 true,否则请返回 false。要注意的是,可能会有多条日志在同一时间被系统接收。示例:思路:map(key:message, value: 时...原创 2020-01-28 09:46:32 · 485 阅读 · 0 评论 -
无尽SQL之 第二高的薪水
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。IdSalary110022003300例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。SecondHighestSalary200思路:limit限制返回的数量...原创 2020-01-28 08:33:31 · 364 阅读 · 0 评论 -
无尽算法之 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [1,3,2]思路:递归题解:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left;...原创 2020-01-26 04:29:30 · 147 阅读 · 0 评论 -
无尽SQL之 连续出现的数字
编写一个 SQL 查询,查找所有至少连续出现三次的数字。IdNum11213142516272例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。ConsecutiveNums1思路:我们这里需要考虑两种情况,leetcode官方认为id是连续的,但是实际上id因为各种原因不连...原创 2020-01-23 05:46:55 · 291 阅读 · 0 评论 -
无尽算法之 Nim 游戏
你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。示例:输入: 4输出: false解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块...原创 2020-01-23 04:09:11 · 221 阅读 · 0 评论 -
无尽算法之 数字的补数
给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。注意:给定的整数保证在32位带符号整数的范围内。你可以假定二进制数不包含前导零位。示例 1:输入: 5输出: 2解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。示例 2:输入: 1输出: 0解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。思路:利用循环右...原创 2020-01-21 05:29:58 · 402 阅读 · 0 评论