算法
文章平均质量分 66
肥叔菌
本博客主要用于记录学习过程中的笔记,每隔一段时间,博主将会将精华内容整合发到知乎、简书上。欢迎关注博主肥叔菌在其他平台上的账号,谢谢。
B站:https://space.bilibili.com/456254145
segmentfault:https://segmentfault.com/u/feishujun/articles
简书:https://www.jianshu.com/u/67bab078551a
展开
-
Internal and Tape Sorting Using the Replacement-Selection Technique
A general technique for sequencing unsorted records is presented. The technique is shown to be applicable for the first stage of a generalized sort program (the formation of initial strings) as well as for sorting records within a memory storage (an intern原创 2023-10-19 00:00:00 · 224 阅读 · 0 评论 -
Peterson‘s Algorism皮特森算法详解
Peterson算法是实现进程互斥访问临界区的一种方法,避免了单标志法必须交替访问的限制,以及双标志法后检验的“饥饿”问题。Pi进程:flag[i] = TRUE; turn = j;while(flag[j] && turn == j);// 访问临界区flag[i] = FALSE;// 剩余区Pj进程:flag[j] = TRUE; turn = i;while(flag[i] && turn == i);// 访问临界区flag[j] = FA原创 2022-05-21 13:52:32 · 817 阅读 · 0 评论 -
收集优秀博文分享
云计算:刘超:https://www.cnblogs.com/popsuper1982/原创 2020-04-09 21:38:05 · 8671 阅读 · 0 评论 -
动态规划 滑动窗口最大值
算法的思想是将输入数组分割成有 k 个元素的块。 若 n % k != 0,则最后一块的元素个数可能更少。开头元素为 i ,结尾元素为 j 的当前滑动窗口可能在一个块内,也可能在两个块中。情况 1 比较简单。 建立数组 left, 其中 left[j] 是从块的开始到下标 j 最大的元素,方向 左->右。为了处理更复杂的情况 2,我们需要数组 right,其中 right[j] ...原创 2019-07-30 12:06:54 · 9852 阅读 · 0 评论 -
链表找中点-快慢指针
//偶数个节点,slow指向中点右侧,奇数个节点,slow指向中间节点的下一个节点 //ListNode* fast = head; //ListNode* slow = head; //while(fast){ //fast = fast->next; //slow = slow...原创 2019-07-25 10:48:01 · 9253 阅读 · 0 评论 -
6道经典递归、回溯、分治相关题目-生成括号
原创 2019-07-17 21:29:38 · 8760 阅读 · 0 评论 -
从前序中序遍历或中序后序遍历恢复二叉树
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { //剑指Offer 第2版 64页 if(preorder.size() == 0 || inorder.size() == 0) return nullptr; retur...原创 2019-07-29 21:20:16 · 8646 阅读 · 0 评论 -
二叉树的后序遍历相关题目
原创 2019-07-29 21:07:05 · 8958 阅读 · 0 评论 -
4道经典二叉树相关题目-二叉查找树的编码与解码
//宽度搜索class Codec {public: // Encodes a tree to a single string. string serialize(TreeNode* root) { if (!root) return ""; ostringstream os; queue<TreeNode*&...原创 2019-07-20 14:30:06 · 8758 阅读 · 0 评论 -
位运算相关题目-比特位计数 关于数字为1比特位数量之间关系的三个恒等式
利用上一节的n&(n-1)的性质:动态规划 + 最高有效位利用已有的计数结果来生成新的计数结果。以二进制形式检查 [0, 3]的范围:可以看出, 2 和 3 的二进制形式可以通过给 0 和 1 的二进制形式在前面加上 1 来得到。类似的,我们可以使用 [0, 3]作为蓝本来得到 [4, 7]。public class Solution { public int[] ...原创 2019-07-24 20:08:42 · 8971 阅读 · 0 评论 -
哈希表与字符串的相关题目-词语模式 同字符词语分组
class Solution {public: vector<vector<string>> groupAnagrams(vector<string>& strs) { if(strs.empty()) return vector<vector<string>>{}; ...原创 2019-07-20 21:03:18 · 8658 阅读 · 0 评论 -
单链表的排序 插入排序 归并排序
插入排序 O(n^2)利用vector来进行插入排序,这里展示了较标准的插入排序leetcode执行16ms的实例1.从链表中的第二个节点和第一个节点比,如果小于,就得插入到链表头,这里可以创建哑头部来简化操作2.从链表中把要插入的节点取出后,从哑头部遍历该插入的位置(由于需要知道待插入位置的前驱,就必须从哑头部开始,并判别其后继的值)ListNode* insertionSort...原创 2019-07-25 11:34:01 · 8811 阅读 · 0 评论 -
哈希表与字符串的相关题目-重复的DNA序列
class Solution {public: int returnChar(char c){ switch(c){ case 'A': return 0; case 'C': return 1; ...原创 2019-07-21 13:42:58 · 8698 阅读 · 0 评论 -
哈希表与字符串的相关题目- 使用滑动窗口 无重复字符的最长子串 最小窗口子串
原创 2019-07-21 13:45:39 · 8586 阅读 · 0 评论 -
位运算- 数组中两个数的最大异或值 贪心算法+树或哈希表
贪心规律:二进制下,我们希望一个数尽可能大,即希望越高位上越能够出现“1”,这样这个数就是所求的最大数,这是贪心算法的思想。即我们选择的两个数异或要尽可能让高位为1。方法一:建立一个深度为32的树,从一个数的第31位开始,如果为0则向左子树走,否则向右子树走。最后将数放在叶节点中。在查找时,根据当前的数字,选择和其搭配使异或值最大的数字。即如果该数的某位为1,则需要选择另一个数该位为0,否则只...原创 2019-07-25 13:55:39 · 9748 阅读 · 0 评论 -
5道经典深度优先搜索与宽度优先搜索相关题目-词语阶梯
class Solution {public: int ladderLength(string beginWord, string endWord, vector<string>& wordList) { unordered_set<string> dict(wordList.begin(), wordList.end())...原创 2019-07-25 20:51:25 · 8951 阅读 · 0 评论 -
5道经典深度优先搜索与宽度优先搜索相关题目-收集雨水
原创 2019-07-26 11:13:19 · 9485 阅读 · 0 评论 -
5道经典深度优先搜索与宽度优先搜索相关题目-火柴棍摆正方形
原创 2019-07-26 11:35:47 · 8598 阅读 · 0 评论 -
二叉树的前中序遍历 递归和迭代
递归vector<int> inorderTraversal(TreeNode* root) { vector<int> result; //递归方案 inorder(root, result); return result; } void inorder(TreeNode* root, v...原创 2019-07-27 22:52:58 · 8813 阅读 · 0 评论 -
6道经典递归、回溯、分治相关题目-求子集1,2 组合数之和2
//另一种想法class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; vector<int> out; so...原创 2019-07-17 18:27:43 · 8579 阅读 · 0 评论 -
二分查找相关题目-旋转数组查找
class Solution {public: int search(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; while(left <= right){ int mid = left + (...原创 2019-07-20 12:15:28 · 8672 阅读 · 0 评论 -
有关图的题目-课程安排
原创 2019-07-19 21:02:29 · 8698 阅读 · 0 评论 -
8道链表常考题-复杂链表的深度拷贝
通过map来保存原链表节点之间的关系,协助创建新链表-》方法一通过map来保存新旧地址的映射,遍历原链表(next或random和next)来创建新的链表-》方法二三leetcode官方解法:https://leetcode-cn.com/problems/copy-list-with-random-pointer/solution/fu-zhi-dai-sui-ji-zhi-zh...原创 2019-07-11 16:38:45 · 8603 阅读 · 0 评论 -
8道链表常考题-链表划分
LeetCode官方题解本题要求我们改变链表结构,使得值小于 x的元素,位于值大于等于x元素的前面。这实质上意味着在改变后的链表中有某个点,在该点之前的元素全部小于x ,该点之后的元素全部 大于等于x。 我们将这个点记为JOINT。对该问题的逆向工程告诉我们,如果我们在JOINT将改后链表拆分,我们会得到两个更小的链表,其中一个包括全部值小于x的元素,另一个包括全部值大于x的元素。在解...原创 2019-07-11 12:28:11 · 8922 阅读 · 0 评论 -
8道链表常考题-链表逆序
单链表的基本操作链表逆序1已知链表头节点指针head,将链表逆序。(不可申请额外空间)迭代法:头插到新链表中复杂度分析时间复杂度:O(n),假设 n 是列表的长度,时间复杂度是 O(n)。空间复杂度:O(1)。递归法:/** * Definition for singly-linked list. * struct ListNode { * in...原创 2019-07-05 16:16:20 · 13619 阅读 · 0 评论 -
7道经典贪心算法相关题目-移除k个数字
原创 2019-07-14 11:56:56 · 8662 阅读 · 0 评论 -
7道经典贪心算法相关题目-摇摆序列
原创 2019-07-13 21:32:52 · 8737 阅读 · 0 评论 -
7道经典贪心算法相关题目-分糖果
原创 2019-07-13 20:25:37 · 9820 阅读 · 0 评论 -
8道链表常考题-一次遍历删除链表倒数第N个节点
可以使用两个指针而不是一个指针。第一个指针从列表的开头向前移动 n+1 步,而第二个指针将从列表的开头出发。现在,这两个指针被 nn 个结点分开。我们通过同时移动两个指针向前来保持这个恒定的间隔,直到第一个指针到达最后一个结点。此时第二个指针将指向从最后一个结点数起的第 n 个结点。我们重新链接第二个指针所引用的结点的 next 指针指向该结点的下下个结点。public ListNode re...原创 2019-07-13 14:32:25 · 8840 阅读 · 0 评论 -
7道经典栈、队列、堆的题目-简单计算器
class Solution {public: void compute(std::stack<unsigned int> &number_stack, std::stack<char> &operation_stack){ if (number_stack.size() < 2){ return; } ...原创 2019-07-12 19:55:36 · 9167 阅读 · 0 评论 -
6道经典递归、回溯、分治相关题目-N皇后问题
class Solution {public: vector<vector<string>> result; int** isValid; int* pos; void Sub(int s, int n) { if (s > n) { vector<s...原创 2019-07-18 10:54:49 · 8782 阅读 · 0 评论 -
8道链表常考题-链表求交点
已知链表A的头节点指针headA,链表B的头节点指针headB,两个链表相交,求两链表交点对应的节点。使用set求交集1.遍历链表A,将A中节点对应的指针(地址),插入set2.遍历链表B,将B中节点对应的指针(地址),在set中查找,发现在set中的第一个节点地址,即是两个链表的交点。...原创 2019-07-07 11:28:52 · 9058 阅读 · 0 评论 -
4道经典二叉树相关题目-侧面观察二叉树
class Solution {public: vector<int> rightSideView(TreeNode* root) { vector<TreeNode* > a; vector<int> re; if(!root) return re; a.push_back(ro...原创 2019-07-19 19:53:53 · 8796 阅读 · 0 评论 -
动态规划 最小的必要团队 找零钱
典型的背包问题,用位图实现,递推公式dp[x|y] = min(dp[x|y],dp[x] + dp[y])class Solution {public: vector<int> smallestSufficientTeam(vector<string>& req_skills, vector<vector<string>>&a...原创 2019-07-29 14:48:35 · 8581 阅读 · 0 评论 -
位运算相关题目-一些小trick 1bit代表独立数字 求只出现一次的数字 无进位n进制数 n&(-n) Boyer-Moore 投票算法 n&(n-1)
二进制位方法集合的每个元素,都有可以选或不选,用二进制的位来表示,0表示不选,1表示选自。0x1 << nums.size()-1 的每一位就代表了集合中每个元素都选用。这里由于集合中每个元素都不相同,所以可以用二进制位唯一地表示它们。每次循环遍历该数的每位bit的状态可以判别是否加入其所表示的元素。递归回溯的方法见:https://blog.csdn.net/asmartkil...原创 2019-07-24 11:14:04 · 8641 阅读 · 0 评论 -
二分查找细节详解
编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏个等号,要么少加个 1(比如不等号是否应该带等号,mid 是否应该加一等等。)。不要气馁,因为二分查找其实并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的:Although the basic idea of binary search is comparatively straightforward,...原创 2019-07-16 22:04:42 · 20523 阅读 · 10 评论 -
7道经典栈、队列、堆的题目-包含min函数的栈 合法出栈序列
一个变量无法完成记录栈中所有状态下的最小值。原创 2019-07-12 16:35:49 · 8525 阅读 · 0 评论 -
7道经典栈、队列、堆的题目-使用队列实现栈,栈实现队列
栈是一种 后进先出(last in - first out, LIFO)的数据结构,栈内元素从顶端压入(push),从顶端弹出(pop)。一般我们用数组或者链表来实现栈,但是这篇文章会来介绍如何用队列来实现栈。队列是一种与栈相反的 先进先出(first in - first out, FIFO)的数据结构,队列中元素只能从 后端(rear)入队(push),然后从 前端(front)端出队(p...原创 2019-07-12 15:19:50 · 9562 阅读 · 0 评论 -
8道链表常考题-排序链表归并
https://leetcode-cn.com/problems/merge-k-sorted-lists//** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(...原创 2019-07-12 11:12:02 · 8557 阅读 · 0 评论 -
4道经典二叉树相关题目-路径之和2 最近公共祖先
class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root == nullptr || root == p || root == q){return root; } TreeNod...原创 2019-07-18 16:40:40 · 8740 阅读 · 0 评论