- 博客(38)
- 资源 (10)
- 收藏
- 关注
原创 动态规划 滑动窗口最大值
算法的思想是将输入数组分割成有 k 个元素的块。 若 n % k != 0,则最后一块的元素个数可能更少。开头元素为 i ,结尾元素为 j 的当前滑动窗口可能在一个块内,也可能在两个块中。情况 1 比较简单。 建立数组 left, 其中 left[j] 是从块的开始到下标 j 最大的元素,方向 左->右。为了处理更复杂的情况 2,我们需要数组 right,其中 right[j] ...
2019-07-30 12:06:54 9834
原创 从前序中序遍历或中序后序遍历恢复二叉树
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 8643
原创 动态规划 最小的必要团队 找零钱
典型的背包问题,用位图实现,递推公式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 8580
原创 二叉树的前中序遍历 递归和迭代
递归vector<int> inorderTraversal(TreeNode* root) { vector<int> result; //递归方案 inorder(root, result); return result; } void inorder(TreeNode* root, v...
2019-07-27 22:52:58 8812
原创 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 8946
原创 位运算- 数组中两个数的最大异或值 贪心算法+树或哈希表
贪心规律:二进制下,我们希望一个数尽可能大,即希望越高位上越能够出现“1”,这样这个数就是所求的最大数,这是贪心算法的思想。即我们选择的两个数异或要尽可能让高位为1。方法一:建立一个深度为32的树,从一个数的第31位开始,如果为0则向左子树走,否则向右子树走。最后将数放在叶节点中。在查找时,根据当前的数字,选择和其搭配使异或值最大的数字。即如果该数的某位为1,则需要选择另一个数该位为0,否则只...
2019-07-25 13:55:39 9738
原创 单链表的排序 插入排序 归并排序
插入排序 O(n^2)利用vector来进行插入排序,这里展示了较标准的插入排序leetcode执行16ms的实例1.从链表中的第二个节点和第一个节点比,如果小于,就得插入到链表头,这里可以创建哑头部来简化操作2.从链表中把要插入的节点取出后,从哑头部遍历该插入的位置(由于需要知道待插入位置的前驱,就必须从哑头部开始,并判别其后继的值)ListNode* insertionSort...
2019-07-25 11:34:01 8806
原创 链表找中点-快慢指针
//偶数个节点,slow指向中点右侧,奇数个节点,slow指向中间节点的下一个节点 //ListNode* fast = head; //ListNode* slow = head; //while(fast){ //fast = fast->next; //slow = slow...
2019-07-25 10:48:01 9247
原创 位运算相关题目-比特位计数 关于数字为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 8966
原创 位运算相关题目-一些小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 8638
原创 哈希表与字符串的相关题目-重复的DNA序列
class Solution {public: int returnChar(char c){ switch(c){ case 'A': return 0; case 'C': return 1; ...
2019-07-21 13:42:58 8695
原创 哈希表与字符串的相关题目-词语模式 同字符词语分组
class Solution {public: vector<vector<string>> groupAnagrams(vector<string>& strs) { if(strs.empty()) return vector<vector<string>>{}; ...
2019-07-20 21:03:18 8655
原创 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 8757
原创 二分查找相关题目-旋转数组查找
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 8670
原创 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 8794
原创 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 8739
原创 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 8780
原创 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 8576
原创 二分查找细节详解
编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏个等号,要么少加个 1(比如不等号是否应该带等号,mid 是否应该加一等等。)。不要气馁,因为二分查找其实并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的:Although the basic idea of binary search is comparatively straightforward,...
2019-07-16 22:04:42 20490 10
原创 8道链表常考题-一次遍历删除链表倒数第N个节点
可以使用两个指针而不是一个指针。第一个指针从列表的开头向前移动 n+1 步,而第二个指针将从列表的开头出发。现在,这两个指针被 nn 个结点分开。我们通过同时移动两个指针向前来保持这个恒定的间隔,直到第一个指针到达最后一个结点。此时第二个指针将指向从最后一个结点数起的第 n 个结点。我们重新链接第二个指针所引用的结点的 next 指针指向该结点的下下个结点。public ListNode re...
2019-07-13 14:32:25 8837
原创 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 9163
原创 7道经典栈、队列、堆的题目-使用队列实现栈,栈实现队列
栈是一种 后进先出(last in - first out, LIFO)的数据结构,栈内元素从顶端压入(push),从顶端弹出(pop)。一般我们用数组或者链表来实现栈,但是这篇文章会来介绍如何用队列来实现栈。队列是一种与栈相反的 先进先出(first in - first out, FIFO)的数据结构,队列中元素只能从 后端(rear)入队(push),然后从 前端(front)端出队(p...
2019-07-12 15:19:50 9550
原创 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 8555
原创 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 8598
原创 8道链表常考题-链表划分
LeetCode官方题解本题要求我们改变链表结构,使得值小于 x的元素,位于值大于等于x元素的前面。这实质上意味着在改变后的链表中有某个点,在该点之前的元素全部小于x ,该点之后的元素全部 大于等于x。 我们将这个点记为JOINT。对该问题的逆向工程告诉我们,如果我们在JOINT将改后链表拆分,我们会得到两个更小的链表,其中一个包括全部值小于x的元素,另一个包括全部值大于x的元素。在解...
2019-07-11 12:28:11 8920
原创 8道链表常考题-链表求交点
已知链表A的头节点指针headA,链表B的头节点指针headB,两个链表相交,求两链表交点对应的节点。使用set求交集1.遍历链表A,将A中节点对应的指针(地址),插入set2.遍历链表B,将B中节点对应的指针(地址),在set中查找,发现在set中的第一个节点地址,即是两个链表的交点。...
2019-07-07 11:28:52 9056
原创 8道链表常考题-链表逆序
单链表的基本操作链表逆序1已知链表头节点指针head,将链表逆序。(不可申请额外空间)迭代法:头插到新链表中复杂度分析时间复杂度:O(n),假设 n 是列表的长度,时间复杂度是 O(n)。空间复杂度:O(1)。递归法:/** * Definition for singly-linked list. * struct ListNode { * in...
2019-07-05 16:16:20 13617
qttest.rar
2020-02-21
信息可视化 交互设计
2019-01-21
实时碰撞检测算法技术
2019-01-21
嵌入式系统 硬件与软件架构
2019-01-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人