LeetCode 并发

LeetCode 并发 题目 1114 按序打印 C++ mutex class Foo { mutex lock1, lock2; public: Foo() { lock1.lock(); lock2.lock(); } void first(function<void()> printFirst) { printFirst(); lock1.unlock(); } void second(function<void()> printSecond) { lock1.lock(); printSecond(); lock1.unlock(); lock2.unlock(); } void third(function<void()> printThird) { lock2.lock(); printThird(); lock2.unlock(); } }; C++ condition_variable class Foo { int i; mutex mut; condition_variable con_var1, con_var2; public: Foo() : i(1) { } void first(function<void()> printFirst) { unique_lock<mutex> lock(mut); printFirst(); ++i; con_var1....

July 22, 2019 · 3 min

LeetCode 树(2)

LeetCode 树(2) 题目 3. 二叉搜索树 95 不同的二叉搜索树 II 生成由 1 … n 为节点所组成的二叉搜索树。 为了构造以 i 为根节点的二叉搜索树,我们需要先构造以 1 … i - 1 为左子树的所有二叉搜索树与以 i + 1 … n 为右子树的所有二叉搜索树,再将这些子树排列组合得到以 i 为根节点的所有二叉搜索树。 class Solution { public: vector<TreeNode *> generateTrees(int n) { if (n == 0) return {}; return Generate(1, n); } vector<TreeNode *> Generate(int m, int n) { vector<TreeNode *> nodes; if (m == n) nodes.push_back(new TreeNode(n)); if (m > n) nodes.push_back(nullptr); if (m >= n) return nodes; for (int i = m; i <= n; ++i) { vector<TreeNode *> left = Generate(m, i - 1); vector<TreeNode *> right = Generate(i + 1, n); for (auto &l:left) for (auto &r:right) { TreeNode *node = new TreeNode(i); node->left = l, node->right = r; nodes....

July 18, 2019 · 5 min

LeetCode 树(1)

LeetCode 树(1) 题目 1. 树的遍历 144 二叉树的前序遍历 前序遍历一个二叉树。 前序遍历是按照根节点,左子节点,右子节点的顺序来遍历一个二叉树,有递归和迭代两种方法。对于迭代方法,先将节点加入结果数组,然后用一个栈保存右,左子节点,依次访问,重复此过程。 class Solution { vector<int> res; public: vector<int> preorderTraversal(TreeNode *root) { res = vector<int>(); Preorder(root); return res; } void Preorder(TreeNode *root) { if (!root) return; res.push_back(root->val); Preorder(root->left); Preorder(root->right); } }; class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int> res; if (!root) return res; stack<TreeNode *> pre; pre.push(root); while (!pre.empty()) { TreeNode *node = pre.top(); pre.pop(); res.push_back(node->val); if (node->right) pre.push(node->right); if (node->left) pre....

July 13, 2019 · 7 min

LeetCode 链表(2)

LeetCode 链表(2) 题目 4. 双指针 19 删除链表的倒数第N个节点 删除链表的倒数第 n 个节点。 在链表中不易直接取到倒数第 n 个位置,所以用两个指针 prev 和 tail,tail 先往前走 n 步,然后两个指针一起往前走直到 tail 没有后继指针,此时 prev 的后继指针就是倒数第 n 个位置,删除其即可。注意如果要删除的指针是头指针的话要单独处理。 class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode *prev = head, *tail = head; for (int i = 0; i < n; ++i) tail = tail->next; if (!tail) { head = head->next; delete prev; return head; } while (tail->next) tail = tail->next, prev = prev->next; ListNode *next = prev->next; prev->next = next->next; delete next; return head; } }; 61 旋转链表 给一个链表,将其每个节点向右移动 k 个位置。...

July 9, 2019 · 6 min

LeetCode 链表(1)

LeetCode 链表(1) 题目 1. 常规题 2 两数相加 给两个链表分别代表两个正数的逆序表示,计算两个链表之和。 依次按位进行相加。 class Solution { public: ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { int acc = 0, val = 0; auto head = l1, tail = l1; while (l1 && l2) { val = l1->val + l2->val + acc; acc = val / 10; l1->val = val % 10; if (!l1->next) l1->next = l2->next, l2->next = nullptr; tail = l1; l1 = l1->next, l2 = l2->next; } while (l1) { val = l1->val + acc; acc = val / 10; l1->val = val % 10; tail = l1; l1 = l1->next; } if (acc) tail->next = new ListNode(1); return head; } }; 21 合并两个有序链表 合并两个有序链表。...

July 4, 2019 · 7 min