算法
文章平均质量分 95
老王不让用
芝兰生于幽谷,不以无人而不芳; 君子修身立德,不为穷困而改节
展开
-
找出二进制数中bit为1的最(高/低)索引
目录1、迭代法2、二分法3、整形形式输出题目:给定一个整形(unsigned int)数字,输出其二进制数中的bit为1 的最高/低位索引。示例:对于数据0,返回0;数据1,返回1;数据0x80000000,返回32;本文以搜索最低位即最右侧的bit1索引为例。1、迭代法int search_right_one(unsigned int var){ int index = 0; while(var) { index++; if(var & 0x1)原创 2020-09-03 12:03:59 · 8181 阅读 · 1 评论 -
linux C编程:重写 memcpy 函数
目录1、地址重叠2、SSE指令效率提升实现 memcpy 是各个大厂都喜欢出的面试题,主要是因为memcpy存在两个考点:地址重叠、效率提升。由于linux的标准C库中的接口并未解决这两个问题,加上内存拷贝是非常常用的库函数,因此备受面试官的青睐。1、地址重叠linux 用户手册说明 memcpy 不支持地址重叠,加入地址发生重叠则需要通过 memmove来代替,先来看一下memcpy的源码实现:/** * memcpy - Copy one area of memory to原创 2020-09-03 09:27:06 · 1983 阅读 · 0 评论 -
认识 LFU 算法
1、LeetCode460. LFU缓存请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。它应该支持以下操作:get和put。get(key)- 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。put(key, value)- 如果键已存在,则变更其值;如果键不存在,请插入键值对。当缓存达到其容量时,则应该在插入新项之前,使最不经常使用的项无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除最久未使用的键。「项的使用次数」就是自插入该项...转载 2020-08-13 15:35:34 · 980 阅读 · 0 评论 -
认识 LRU 算法
目录1、LRU 算法描述2、LeetCode146. LRU缓存机制2.1、算法设计2.2、代码实现1、LRU 算法描述LRU 算法就是一种缓存淘汰策略,原理不难,但是面试中写出没有 bug 的算法比较有技巧,需要对数据结构进行层层抽象和拆解。计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?LRU转载 2020-08-12 18:37:07 · 970 阅读 · 0 评论 -
二叉树:先序、中序、后序、层次遍历
数据结构:二叉树的常见操作1、二叉树的创建2、二叉树的先序遍历:递归、迭代3、二叉树的中序遍历:递归、迭代4、二叉树的后序遍历:递归、迭代5、根据先序、中序生成二叉树6、根据中序、后序生成二叉树7、求二叉树的叶子节点之和8、求二叉树的叶子节点的父节点之和9、求二叉树的最大/小深度10、求二叉树的 正向/逆向 路径和...原创 2020-04-30 22:34:53 · 374 阅读 · 0 评论 -
约瑟夫环——公式法(递推公式)
约瑟夫问题约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉。首先A开始报数,他报1。侥幸逃过一劫。 然后轮到B报数,他报2。非常惨,他被杀了 C接着从1开始报数 接着轮到A报数,他报2。也被杀死了。 最终胜利者是C解决方案普通解法刚学数据结构的时候,我们可能用链表或者队列的方法去模拟这个过程,N个人看作转载 2020-08-04 21:13:36 · 3542 阅读 · 0 评论 -
0-1背包相关题集
1、LeetCode416. 分割等和子集 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例2:输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子集.注意:每个数组中的元素不会超过 100 数组的大小不会超过 2001.1、动态规划Ⅰ算法:1、定义dp[i][j...原创 2020-07-19 21:05:02 · 314 阅读 · 0 评论 -
完全背包相关题集
零钱兑换是典型的完全背包问题,因为没有限制硬币的使用次数,将完全背包压缩成一维空间在求解种类数时需要注意必须将物品列表置于外层循环,而包重则为内层循环,以求得组合数,颠倒则是排列数。目录1、零钱兑换问题1.1、LeetCode322. 零钱兑换1.1.1、二维动态状态方程1.1.2、压缩成一维状态空间1.2、LeetCode518. 零钱兑换 II1.2.1、二维动态状态方程1.2.2、压缩成一维状态空间2、爬楼梯问题2.1、LeetCode70. 爬楼...原创 2020-07-17 22:35:08 · 550 阅读 · 0 评论 -
0-1背包和完全背包的差异分析
1、动态规划2、回溯算法3、应用场景3.1、LeetCode416. 分割等和子集3.2、完全背包原创 2020-07-17 22:33:34 · 720 阅读 · 0 评论 -
特殊数据结构:单调栈
鉴于单调栈应用场景多,特定将LeetCode中用到单调栈解决问题的题集收拢成一文方便对比分析7、LeetCode316. 去除重复字母9、LeetCode402. 移掉K位数字10、LeetCode321. 拼接最大数11、LeetCode581. 最短无序连续子数组12、LeetCode42. 接雨水13、LeetCode84. 柱状图中最大的矩形14、LeetCode907. 子数组的最小值之和...原创 2020-07-17 22:32:08 · 326 阅读 · 0 评论 -
数独问题合集
目录1、LeetCode36. 有效的数独1.1、三次循环遍历O(3*N)1.2、一次迭代2、LeetCode37. 解数独1、LeetCode36. 有效的数独判断一个9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字1-9在每一行只能出现一次。数字1-9在每一列只能出现一次。数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。上图是一个部分填充的有效的数独。数独部分空格内已填入了数字,空白格用'.'表示。...原创 2020-07-17 22:31:38 · 1058 阅读 · 0 评论 -
下一个更大元素相关题集
4、LeetCode单调栈题集2、LeetCode42. 接雨水4、LeetCode84. 柱状图中最大的矩形3、LeetCode907. 子数组的最小值之和3、leetcode1019. 链表中的下一个更大节点496.下一个更大元素I503.下一个更大元素II1118.一月有多少天739. 每日温度(中等) 暴力解法 + 单调栈316. 去除重复字母(困难) 栈 + 哨兵技巧(Java、C++、Python)901. 股票价格跨度(中等) 「力扣」第...原创 2020-07-12 19:23:33 · 273 阅读 · 0 评论 -
特殊数据结构:栈和队列的相互转化
队列是一种先进先出的数据结构,栈是一种先进后出的数据结构,形象一点就是这样:目录1、LeetCode232. 用栈实现队列2、LeetCode225. 用队列实现栈1、LeetCode232. 用栈实现队列使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。示例:MyQueue queue = new MyQueue()..转载 2020-07-12 19:21:51 · 258 阅读 · 0 评论 -
特殊数据结构:优先队列(二叉堆)
二叉堆(Binary Heap)没什么神秘,性质比二叉搜索树 BST 还简单。其主要操作就两个,sink(下沉)和 swim(上浮),用以维护二叉堆的性质。其主要应用有两个,首先是一种排序方法「堆排序」,第二是一种很有用的数据结构「优先级队列」。 本文就以实现优先级队列(Priority Queue)为例,通过图片和人类的语言来描述一下二叉堆怎么运作的。目录1、二叉堆概览2、优先级队列概览3、实现 swim 和 sink4、实现 delMax 和 ins...转载 2020-07-12 19:20:55 · 332 阅读 · 0 评论 -
团灭 LeetCode 打家劫舍问题
目录1、LeetCode198.打家劫舍1.1、动态规划(官方题解)1.2、动态规划(二维数组)1.3、回溯算法2、LeetCode213.打家劫舍II(环形数组)3、LeetCode337.打家劫舍III(二叉树)3.1、动态规划3.2、回溯算法1、LeetCode198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会...原创 2020-07-04 21:25:35 · 907 阅读 · 0 评论 -
团灭 LeetCode 股票买卖问题
目录1、动态规划架构1.1、穷举框架1.2、状态转移框架2、LeetCode121. 买卖股票的最佳时机2.1、动态规划2.2、寻找历史最小值3、LeetCode122. 买卖股票的最佳时机 II3.2、峰谷法3.3、贪心算法(遇到递增就累加)4、LeetCode123. 买卖股票的最佳时机 III5、LeetCode188. 买卖股票的最佳时机 IV6、LeetCode309. 最佳买卖股票时机含冷冻期7、LeetCode714. 买卖股票的最佳时机含手转载 2020-07-04 21:22:54 · 737 阅读 · 0 评论 -
认识 KMP 算法
目录1 KMP算法1.1 定义1.2 步骤1.3 解释1.3.1 寻找最长前缀后缀1.3.2 基于《最大长度表》匹配1.3.3 根据《最大长度表》求next 数组1.3.4 通过代码递推计算next 数组(核心)1.3.5 基于《next 数组》匹配1.3.6 基于《最大长度表》与基于《next 数组》等价1.3.7 Next 数组与有限状态自动机1.3.8 Next 数组的优化1.4 KMP的时间复杂度分析1 KMP算法1.1 定义 ...转载 2020-07-04 21:18:16 · 330 阅读 · 0 评论 -
字符串匹配算法之strStr()实现
LeetCode28. 实现 strStr() public int strStr(String haystack, String needle) { KMP kmp = new KMP(needle); return kmp.search(haystack); } class KMP{ private String pat; int [][]dp; public KM...原创 2020-07-04 21:19:57 · 609 阅读 · 0 评论 -
扒一扒滑动窗口算法的裤子
76.最小覆盖子串567.字符串的排列438.找到字符串中所有字母异位词3.无重复字符的最长子串转载 2020-06-26 21:16:14 · 149 阅读 · 0 评论 -
再次认识回溯算法
目录1、算法框架2、LeetCode面试题 08.04. 幂集2.1、回溯算法2.2、存在重复元素(进阶)3、46. 全排列3.1、套用回溯算法架构3.2、存在重复元素4、51. N皇后5、LeetCode22. 括号生成6、37. 解数独7、小结1、算法框架解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:1、路径:也就是已经做出的选择。2、选择列表:也就是你当前可以做的选择。3、结束条件:也就是到达决策树底层,无法再做选转载 2020-07-04 21:16:46 · 416 阅读 · 0 评论 -
特殊数据结构:单调队列
单调队列:保持队列中的元素递增或者递减,具体需要借助双向队列这个特殊的数据结构实现。单调递减队列:将排在新元素前面的且小于的元素删除,然后新元素进入队列。由于队列是单调递减的,因此必须从队列尾部向队列头开始遍历,将小于新元素的全部删除(deque.pullLast),是否需要将等于新元素值的元素也删掉取决于实际应用场景。核心实现:就是新元素从尾部进入队列时将前面的小于或者大于新元素值的元素全部删除。1、LeetCode239. 滑动窗口最大值 给定一个数组 nums,有一个大小为k...转载 2020-06-20 20:48:26 · 273 阅读 · 0 评论 -
子数组/序列的问题研究
目录1、LeetCode53. 最大子序和1.1、暴力破解1.2、动态规划1.3、分治算法2、LeetCode300. 最长上升子序列2.1、动态规划2.2、二分查找3、LeetCode907. 子数组的最小值之和3.1、暴力破解3.2、单调栈4、LeetCode891. 子序列宽度之和1、LeetCode53. 最大子序和给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1..原创 2020-06-20 20:48:54 · 474 阅读 · 0 评论 -
接雨水问题的研究
目录1、LeetCode11. 盛最多水的容器1.1、暴力破解1.2、双指针2、LeetCode42. 接雨水2.1、动态编程2.2、双指针2.3、双指针Ⅱ2.4、单调栈3、LeetCode407. 接雨水 II4、LeetCode84. 柱状图中最大的矩形4.1、暴力破解4.2、分治算法4.3、单调递增栈1、LeetCode11. 盛最多水的容器1.1、暴力破解计算容器的所有组合场景的盛水量,利用木桶原理剪枝1.2、双指针算法:定义左原创 2020-06-20 20:47:49 · 396 阅读 · 0 评论 -
认识二分查找算法
目录1、算法框架2、LeetCode704. 二分查找3、LeetCode34. 在排序数组中查找元素的第一个和最后一个位置3.1、搜索左侧边界3.2、搜索右侧边界1、算法框架《二分查找详解》2、LeetCode704. 二分查找给定一个n个元素有序的(升序)整型数组nums 和一个目标值target ,写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], ...原创 2020-06-20 20:46:24 · 228 阅读 · 0 评论 -
再次认识二分查找之搜索旋转数组
目录1、LeetCode189. 旋转数组1.1、暴力破解1.2、环状替换1.3、数组反转法2、LeetCode33. 搜索旋转排序数组3、LeetCode81. 搜索旋转排序数组 II4、LeetCode面试题 10.03. 搜索旋转数组4.1、搜索左侧边界4.2、搜索右侧边界5、寻找旋转有序数组的最值(无重复元素)5.1、LeetCode153. 寻找旋转排序数组中的最小值5.2、寻找旋转有序数组的最大值6、寻找旋转排序数组中的最值 II(存在重复值)原创 2020-06-20 20:47:26 · 820 阅读 · 0 评论 -
两、三、四数之和
目录1、LeetCode1. 两数之和1.1、暴力破解1.2、借助哈希表1.3、排序+双指针2、LeetCode15. 三数之和2.1、暴力破解2.2、排序+双指针3、LeetCode16. 最接近的三数之和3.1、暴力破解3.2、排序+双指针4、LeetCode18. 四数之和4.1、暴力破解4.2、排序+双指针4.3、N个数之和+回溯算法4.4、最值优化(重点)5、有序数组N种不同的平方值(字节面试题)6、小结1、LeetCode1原创 2020-06-14 10:20:53 · 358 阅读 · 0 评论 -
再次认识BFS
1、2、3、原创 2020-06-14 10:25:09 · 368 阅读 · 0 评论 -
死磕有效括号Ⅱ
1、LeetCode678. 有效的括号字符串给定一个只包含三种字符的字符串:(,)和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:任何左括号 (必须有相应的右括号 )。 任何右括号 )必须有相应的左括号 (。 左括号 ( 必须在对应的右括号之前 )。 *可以被视为单个右括号 ),或单个左括号 (,或一个空字符串。 一个空字符串也被视为有效字符串。示例 1:输入: "()"输出: True示例 2:输入: "(*)"输出: T...原创 2020-06-10 21:13:32 · 265 阅读 · 0 评论 -
死磕有效括号Ⅰ
目录1、LeetCode20. 有效的括号2、LeetCode22. 括号生成3、LeetCode32. 最长有效括号3.1、滑动窗口暴力破解3.2、借助栈3.3、动态规划1、LeetCode20. 有效的括号给定一个只包括 '(',')','{','}','[',']'?的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true原创 2020-06-09 19:03:30 · 261 阅读 · 0 评论 -
链表:常见的优雅操作
1、leetcode206. 反转链表2、获取中间点2.1、leetcode234. 回文链表3、环形链表原创 2020-05-22 23:23:46 · 328 阅读 · 0 评论 -
链表:与其它数据结构的结合
目录1、leetcode109. 有序链表转换二叉搜索树2、leetcode1367. 二叉树中的列表3、leetcode1019. 链表中的下一个更大节点3.1、暴力破解3.2、单调栈1、leetcode109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],...原创 2020-05-22 15:51:04 · 306 阅读 · 0 评论 -
链表:翻转操作中的一些骚方法
1、leetcode24. 两两交换链表中的节点2、leetcode25. K 个一组翻转链表3、leetcode61. 旋转链表4、leetcode92. 反转链表 II原创 2020-05-21 11:03:09 · 224 阅读 · 0 评论 -
链表:合并操作中的一些骚方法
1、leetcode21. 合并两个有序链表对于两个有序链表的合并操作应用场景还是比较多的,如:链表的归并排序。思路:分别遍历两个链表,依次将头节点值小的取出插入新的链表中即可;注意:当其中一个链表为空时,直接取另一个链表节点即可,两个链表均取完结束循环。 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1 == null && l2 == null){ return nul...原创 2020-05-20 15:02:20 · 282 阅读 · 0 评论 -
链表:删除操作中的一些骚方法
目录1、leetcode19. 删除链表的倒数第N个节点2、leetcode83. 删除排序链表中的重复元素3、leetcode82. 删除排序链表中的重复元素 II4、leetcode1171. 从链表中删去总和值为零的连续节点1、leetcode19. 删除链表的倒数第N个节点给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->..原创 2020-05-19 18:49:15 · 393 阅读 · 0 评论 -
二叉树:公共祖先问题
1、二叉树的最近公共祖先 leetcode2362、节点与其祖先的最大差值 leetcode10263、最深叶节点的最近公共祖先 leetcode11234、面试题 04.08. 首个共同祖先原创 2020-05-04 18:25:03 · 914 阅读 · 0 评论 -
二叉树:路径搜索中的一些问题
1、求二叉树的最大/小深度2、求二叉树的 正向/逆向 路径和原创 2020-05-02 18:10:57 · 577 阅读 · 0 评论 -
二叉树:叶节点的一些操作
叶子节点:没有子节点的节点。1、求叶子节点之和2、求叶子节点的父节点之和3、求左叶子节点leetcode4044、层数最深叶子节点之和leetcode13025、最深叶节点的公共祖先leetcode11236、删除给定值的叶子节点1325...原创 2020-05-01 21:43:24 · 1670 阅读 · 0 评论 -
二叉树:序列构造
1、从前序与中序遍历序列构造二叉树leetcode105先序遍历的顺序是 root -> left -> right,中序:left -> root -> right,这就能方便的从根开始构造一棵树。 首先,preorder 中的第一个元素一定是树的根,这个根又将 inorder 序列分成了左右两棵子树。现在我们只需要将先序遍历的数组中删除根元...原创 2020-05-01 10:34:59 · 3480 阅读 · 0 评论 -
算法:十大排序算法(JAVA实现)
https://images2017.cnblogs.com/blog/849589/201710/849589-20171015223238449-2146169197.gif转载 2020-04-28 13:54:53 · 400 阅读 · 0 评论