
算法
文章平均质量分 92
晓之木初
船到桥头自然直,前提是你努力过!
展开
-
自定义LRU缓存
1. 絮絮叨叨在计算机领域,LRU算法的应用非常多,最常见的就是LRU缓存LRU:Least Recently USed,最近最少使用英文和中文存在差异,如果只看中文,貌似RLU更合适 ????基于LRU算法的缓存系统,可以在达到缓存容量上限时,清理最近最少使用的数据,为新的数据的插入腾出空间leetcode上,也有对应的LRU缓存算法题:146. LRU 缓存机制牛客上,蚂蚁金服的面试题库,LRU缓存也赫然在列题目要求大概如下:设计和实现一个LRU算法的缓存数据结构。需要实现两个操作:原创 2021-12-19 00:56:35 · 313 阅读 · 0 评论 -
剑指offer_面试题23:链表中环的入口节点(交叉链表)、面试题25:合并两个有序链表(合并k个有序链表)、面试题26:树的子结构(树的子树)
面试题23:链表中环的入口节点① 使用哈希表(用时6ms)将不重复的非空节点存入哈希表,第一个重复的节点就是环的入口节点。代码如下:public ListNode detectCycle(ListNode head) { HashMap<ListNode, Integer> map = new HashMap<>(); while (head...原创 2019-12-03 09:16:54 · 293 阅读 · 0 评论 -
LeetCode Top100之76,78,79,84题
写于2019年6月2日76. 最小覆盖子串① 题目描述给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。示例:输入: S = “ADOBECODEBANC”, T = “ABC”输出: “BANC”说明:如果 S 中不存这样的子串,则返回空字符串 “”。如果 S 中存在这样的子串,我们保证它是唯一的答案。② 暴力法(Ti...原创 2019-12-03 09:16:30 · 174 阅读 · 0 评论 -
LeetCode Top100之1,2,3题
记录于2019年5月16日1. 两数之和① 题目描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] =...原创 2019-12-03 09:16:18 · 162 阅读 · 0 评论 -
LeetCode Top100之11,15题
11. 盛最多水的容器① 题目描述给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。示例:输入: [1,8,6,2,5,4,8,3,7]...原创 2019-12-03 09:16:02 · 126 阅读 · 0 评论 -
LeetCode Top100之31,32题
31. 下一个排列① 题目描述实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1② 一次遍历例...原创 2019-12-03 09:15:36 · 140 阅读 · 0 评论 -
LeetCode Top100之39,42,46题
写于2019年5月25日39. 组合总和① 题目描述给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [...原创 2019-12-03 09:15:24 · 158 阅读 · 0 评论 -
LeetCode Top100之62,64题
写于2019年5月28日62. 不同路径① 题目描述一个机器人位于一个 m×nm×nm×n网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,下图是一个7×37×37×3的网格。有多少可能的路径?说明:m 和 n 的值均不超过 100。示例 ...原创 2019-12-03 09:15:06 · 142 阅读 · 0 评论 -
LeetCode Top100之20,21,22,23题
20. 有效的括号① 题目描述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “...原创 2019-12-03 09:14:49 · 155 阅读 · 0 评论 -
LeetCode Top100之70,72,75题
写于2019年5月29日70. 爬楼梯① 题目描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。...原创 2019-12-03 09:14:36 · 155 阅读 · 0 评论 -
LeetCode Top100之17,19题
17. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。② ...原创 2019-12-03 09:14:21 · 127 阅读 · 0 评论 -
LeetCode Top100之4,5,10题
4. 寻找两个有序数组的中位数① 题目描述给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3] nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2...原创 2019-12-03 09:14:03 · 136 阅读 · 0 评论 -
剑指offer_面试题18:删除链表的节点,面试题19:正则表达式匹配,面试题20:表示数值的字符串,面试题21:调整数组顺序是奇数位于偶数前面,面试题22:链表中倒数第k个节点(链表中间节点)
面试题18:删除链表的节点① 题目一:在O(1)O(1)O(1)时间内删除链表节点原本的思想:从头节点开始,遍历链表查找到待删除节点的前驱节点,更改前驱节点的next指针即可。需要判断待删除节点的位置:是头节点、非头节点,同时还有O(n)的时间复杂度。要求使用O(1)O(1)O(1)的时间复杂度,这时有个巧妙的方法:将该节点的后继节点的值赋值给自身,更改自身的next指针以...原创 2019-12-03 09:13:54 · 209 阅读 · 0 评论 -
LeetCode Top100之543,581,617题
写于2019年6月10日(完成了top中所有的easy)543. 二叉树的直径① 题目描述中文描述:https://leetcode-cn.com/problems/diameter-of-binary-tree/② 二叉树求深度的变种之前,求二叉树的深度是从根节点开始,递归得到其左子树、右子树的深度,然后选其中的较大者加1,便是二叉树的深度。其实,就是二叉树的层次或高度。现在求...原创 2019-12-03 09:13:13 · 123 阅读 · 0 评论 -
LeetCode Top100之55,56题
写于2019年5月27日55. 跳跃游戏① 题目描述给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出...原创 2019-12-03 09:12:40 · 177 阅读 · 0 评论 -
LeetCode Top100之114,121,124,128,136题
114. 二叉树展开为链表① 题目描述给定一个二叉树,原地将它展开为链表。例如,给定二叉树将其展开为:② 自己的笨办法 —— 先序遍历再构造二叉树发现展开后的二叉树是原二叉树先序遍历后,只添加右孩子构成。先序遍历获得所有的节点的val,再在以前root的基础上不停地添加右孩子。注意: 方法返回为void,所以直接在root根节点的基础上构造右孩子。代码如下,但没有达到原...原创 2019-12-03 09:12:33 · 178 阅读 · 0 评论 -
剑指offer面试题2:单例模式,面试题3:数组中重复的数字,面试题4:二维数组中的查找,面试题5:替换空格
面试题2:单例模式单例模式的三个典型特点:只有一个实例自我实例化提供全局访问点饿汉模式、非线程安全的懒汉模式、线程安全的懒汉模式。面试题3. 数组中重复的数字① 暴力法:先排序再查找public boolean duplicate(int numbers[], int length, int[] duplication) { // 特殊情况,数组长度为0或者1...原创 2019-12-03 09:11:53 · 495 阅读 · 0 评论 -
LeetCode Top100之560, 394,309题(关于股票有关的所有题目)
写于2019年6月28日560. 和为K的子数组① 题目描述中文描述:https://leetcode-cn.com/problems/subarray-sum-equals-k/② 暴力法从前往后遍历,求解子数组的和sum,如果sum等于target,则计数变量加1。时间复杂度:O(n2)O(n^2)O(n2),空间复杂度:O(1)O(1)O(1)。代码如下,运行时间122m...原创 2019-12-03 09:11:33 · 166 阅读 · 0 评论 -
LeetCode Top100之33,34题
33. 搜索旋转排序数组① 题目描述假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums =...原创 2019-12-03 09:11:15 · 131 阅读 · 0 评论 -
LeetCode Top100之739, 240,338,647,221题
写于2019年6月25日739. 每日温度① 题目描述中文题目:https://leetcode-cn.com/problems/daily-temperatures/② 暴力法从当前温度开始往后进行比较,如果发现较高温度,立即更新当前温度遇到下一个较高温度的天数;一直遍历到数组末尾,都没找到较高温度,则设置其为0.注意: 最后一个温度遇到最高温度的天数一定是0。代码如下,运行...原创 2019-12-03 09:10:59 · 173 阅读 · 0 评论 -
LeetCode Top100之236, 239,279,297,300,322题
236. 二叉树的最近公共祖先① 题目描述中文描述:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/② 递归从根节点开始,如果当前节点为p或q,将其标记为1(表示true);否则为0,表示false。遍历左分支、右分支,如果在左分支或右分支中找到节点p或q,将其标记为1(表示true);否...原创 2019-12-03 09:10:35 · 550 阅读 · 0 评论 -
LeetCode Top100之139,141,155,160,169,198,206题
写于2019年6月9日139. 单词拆分① 题目描述给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: tru...原创 2019-12-03 09:10:09 · 190 阅读 · 0 评论 -
LeetCode Top100之48,49,53题
写于2019年5月26日48. 旋转图像① 题目描述给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix =[ [1,2,3],  ...原创 2019-12-03 09:09:58 · 200 阅读 · 0 评论 -
LeetCode Top100之207, 208,215,287,238,347题
写于2019年6月22日207. 课程表① 题目描述中文题目:https://leetcode-cn.com/problems/course-schedule/② 拓扑排序——查找有向图中是否存在环课程的学习条件,使用二元数组表示。比如[[1,0]],如果用有向图表示,则应该是:01其中课程数表示有向图中的节点数,学习条件数用于构造有向图。[[1, 0], [2, 0],...原创 2019-12-03 09:09:38 · 211 阅读 · 0 评论 -
LeetCode Top100之406, 494,416题( Arrays.sort如何实现降序排列,0-1背包问题)
写于2019年6月27日406. 根据身高重建队列① 题目描述中文题目:https://leetcode-cn.com/problems/queue-reconstruction-by-height/② 根据身高重建队列-排序后插入发现一个规律,每次选择队列中身高最高的人插入新的队列,插入的位置就是他之前所站的人数。如果升高一样,优先选择前面人数较少的插入,这样可以保证对动态数组的...原创 2019-12-03 09:09:20 · 340 阅读 · 0 评论 -
LeetCode Top100之101,102,104,105题
写于2019年6月4日101. 对称二叉树① 题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:说明: 如果你可以运用递归和迭代两种方法解决这个问题,会很加分。② 递归最开始,自己想使用中序遍历,如果获得的数组是对称的,那么二叉树对称。发现...原创 2019-12-03 09:09:09 · 225 阅读 · 0 评论 -
LeetCode Top100之142,146,148,152,200题
写于2019年6月13日142. 环形链表 II① 题目描述中文题目:https://leetcode-cn.com/problems/linked-list-cycle-ii/② 使用HashMap使用HashMap存储所有的非空结点,如果发现结点已经存在,便返回该结点。代码如下,运行时间8ms:public ListNode detectCycle(ListNode he...原创 2019-12-03 09:08:49 · 164 阅读 · 0 评论 -
剑指offer_面试题10:斐波那契数列,面试题11:旋转数组的最小数字(二分查找算法),面试题12:矩阵中的路径,面试题13:机器人的运动范围(岛屿的数量I和II)
面试题10:斐波那契数列① 题目1:求斐波那契数列的第n项f(0)=0;f(1)=1;f(n)=f(n−1)+f(n−2),n>=2f(0)=0;f(1)=1;f(n)=f(n-1)+f(n-2),n>=2f(0)=0;f(1)=1;f(n)=f(n−1)+f(n−2),n>=2使用递归的方式,时间和空间复杂度很大,效率比较低。运行花了983ms。p...原创 2019-12-03 09:08:35 · 231 阅读 · 0 评论 -
剑指offer_面试题6:从尾到头打印链表,面试题7:重建二叉树,面试题8:二叉树的下一个节点,面试题9:用两个栈实现队列
面试题6:从尾到头打印链表要求返回的结果是动态数组,而且元素是链表中结点值从尾到头的顺序。巧借ArrayList.add(0, element)方法,在顺序遍历链表时将结点值逆序存入数组中。public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integ...原创 2019-12-03 09:08:11 · 160 阅读 · 0 评论 -
LeetCode Top100之226,234,283,437,438,448,461,538题(常见的位操作)
写于2019年6月9日226. 翻转二叉树① 题目描述中文描述:https://leetcode-cn.com/problems/invert-binary-tree/② 自己的想法:递归,从上到下,交换左右孩子节点先交换根节点的左右孩子节点,再递归对左右子树进行交换操作。代码如下,运行时间0ms:public TreeNode invertTree(TreeNode roo...原创 2019-12-03 09:07:48 · 306 阅读 · 0 评论 -
剑指offer_面试题14:剪绳子,面试题15:二进制中1的个数(2的整数次方判断、汉明距离),面试题16:数值的整数次方,面试题17:打印从1到最大的n位数(字符串相加、链表相加)
[面试题14:剪绳子](https://leetcode.com/problems/integer-break/description/① 动态规划问题分析:绳子的长度至少为2,剪绳子时,要求至少剪成2段。如果绳子长度为2,则最大乘积为1 x 1 = 1;如果绳子长度为3,则最大乘积为1 x 2 = 2。如果使用动态规划,则dp[i]表示长度为i的绳子,剪断后能获得的最大乘积。...原创 2019-12-03 09:07:23 · 272 阅读 · 0 评论 -
剑指offer_面试题27:二叉树镜像,面试题28:对称的二叉树,面试题29:顺时针打印矩阵,最大公约数和最小公倍数,面试题30:包含min函数的栈,面试题31:栈的压入、弹出序列
面试题27:二叉树镜像注意: 该题让求一棵二叉树的镜像,而不是判断两棵树是否为镜像对称。分析:先画出一个二叉树的镜像:发现与镜像二叉树相比,根节点不变,左孩子成了右孩子,右孩子成了左孩子。于是,可以考虑通在先序遍历的过程中,加入交换左右孩子节点的操作。代码如下:public TreeNode invertTree(TreeNode root) { // ro...原创 2019-12-03 09:06:46 · 232 阅读 · 0 评论 -
剑指offer_面试题32:从上到下打印二叉树,面试题33:二叉树的后续遍历序列(二叉树的路径和相关题型)
面试题32:从上到下打印二叉树题目一:不分行从上到下打印从上到下打印,其实就是二叉树的层次遍历。从根节点开始,下一层的两个节6,10点应该加入容器中。然后先取出容器中的节点6,然后其子节点5,7加入容器。这时容器中有5,7,10,应该下一个取出的是10。不难看出,我们应该使用队列作为容器。层次遍历的递归,只能分行打印!非递归: 直接取出队列中的元素加入最后的结果集合就可...原创 2019-12-03 09:05:47 · 178 阅读 · 0 评论 -
LeetCode Top100之85, 94, 96, 98 (二叉树的几种遍历)
写于2019年6月4日85. 最大矩形① 题目描述给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。示例:输入:[["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]输出: 6② 先计算当前行最大高度...原创 2019-12-03 09:04:01 · 139 阅读 · 0 评论