代码随想录算法训练营day24(day27补) | 77.组合
回溯算法理论基础
回溯算法就是递归
回溯算法是暴力搜索算法
适用问题:
组合(不强调元素的顺序)
切割
子集
排列问题(排列强调元素的顺序)
棋盘问题(N皇后,解数独)
回溯法都可以抽象为一个树形结构
树的宽度=集合的大小
回溯法模板:
void backtracking(参数) {
if (终止条件) {
收集结果;
return;
}
for (集合元素集) {
处理节点;
递归函数;
回溯;
}
return;
}
刷题笔记day24
77.组合
文章讲解:代码随想录
是否自己做出来通过全部用例:否
遇到的困难/犯的错误
递归逻辑不是很清晰,有待理解。
自己写的代码
看了题解后写的代码:
class Solution {
public:
vector<int> path;
vector<vector<int>> result;
...
代码随想录算法训练营day23 | 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
刷题笔记day23
669.修剪二叉搜索树目
文章讲解:代码随想录
是否自己做出来通过全部用例:否
遇到的困难/犯的错误
想用删除二叉搜索树的解法,每次删除一个节点,但是失败了。
自己写的代码
题解方法:
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (!root) return NULL;
if (root->val > high) {
return trimBST(root->left, low, high);
}
if (root->val < low) {
return trimBST(root->right, low, high);
}
root->left = trimBST(root->left, ...
代码随想录算法训练营day22 | 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
刷题笔记day22
235.二叉搜索树的最近公共祖先
文章讲解:代码随想录
是否自己做出来通过全部用例:否
遇到的困难/犯的错误
思考和普通二叉树的区别,利用二叉搜索树的特性,简化代码逻辑。
自己写的代码
看了题解写的代码:
class Solution {
public:
TreeNode* getcomances(TreeNode* node, TreeNode* p, TreeNode* q) {
if (!node) return node;
if (node->val < p->val && node->val < q->val) {
if (TreeNode* right = getcomances(node->right, p, q)) return right;
}
else if (node->val > p->val && node-> ...
代码随想录算法训练营day21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先
刷题笔记day21
530.二叉搜索树的最小绝对差
文章讲解:代码随想录
是否自己做出来通过全部用例:是
遇到的困难/犯的错误
if (pre != NULL) {
int dif = abs(pre->val - node->val);
if (dif < mindif) {
mindif = dif;
}
}
pre = node;
这里的pre要放在if外面,我试图把它放在里面导致pre一直是NULL,永远进不去if条件。
自己写的代码
class Solution {
public:
TreeNode* pre = NULL;
int mindif = INT_MAX;
void getmindif(TreeNode* node) {
if (!node) return;
getmindif(node->left);
if (pre != NULL) {
...
多线程
线程
互斥锁
什么是互斥锁?
互斥锁用于保护共享资源,以确保在同一时间只有一个线程可以访问该资源,从而避免竞态条件。
函数原型
C
在C语言中,互斥锁的函数原型在头文件pthread.h中声明,常用的互斥锁函数有以下几个:
pthread_mutex_init:初始化互斥锁。
pthread_mutex_lock:加锁互斥锁。如果互斥锁已经被其他线程锁定,则当前线程会阻塞,直到获取到锁为止。
pthread_mutex_unlock:解锁互斥锁。
pthread_mutex_destroy:销毁互斥锁。
以下是互斥锁的函数原型和简要用法:
pthread_mutex_t:互斥锁类型。
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr):
该函数用于初始化互斥锁。mutex是指向互斥锁的指针,attr是指向互斥锁属性的指针,通常设为NULL表示使用默认属性。
int pthread_mutex_lock(pthread_mutex_t *mute ...
代码随想录算法训练营day20 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
刷题笔记day20
654.最大二叉树
文章讲解:代码随想录
是否自己做出来通过全部用例:是
遇到的困难/犯的错误
借鉴使用中序和后序遍历序列构造二叉树,对最大二叉树进行区间划分。
自己写的代码
class Solution {
public:
TreeNode* getmaxtree(vector<int>& nums, int begin, int end) {
if (begin >= end) return NULL;
int maxnumindex = begin;
// 找出最大值
for (int i = begin + 1; i < end; ++i) {
if (nums[i] > nums[maxnumindex]) {
maxnumindex = i;
}
}
TreeNode* nod ...
代码随想录算法训练营day18(day19补) | 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树
刷题笔记day18
找树左下角的值
文章讲解:代码随想录
是否自己做出来通过全部用例:是
遇到的困难/犯的错误
用的层序遍历方法,输出最后一层的第一个节点。
自己写的代码
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> result;
if (root) que.push(root);
while (!que.empty()) {
int size = que.size();
vector<int> tmp;
while (size--) {
TreeNode* cur = que.front();
que.pop();
...
代码随想录算法训练营day17(day19补) | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和
刷题笔记day17
110.平衡二叉树
文章讲解:代码随想录
是否自己做出来通过全部用例:否
遇到的困难/犯的错误
没有思路。
自己写的代码
看了题解后写的代码:
class Solution {
public:
int getheight(TreeNode* node) {
if (!node) return 0;
int leftheight = getheight(node->left);
if (leftheight == -1) return -1;
int rightheight = getheight(node->right);
if (rightheight == -1) return -1;
int result;
if (abs(leftheight - rightheight) > 1) return -1;
result = 1 + max(leftheight, rightheight) ...
代码随想录算法训练营day16(day18补) | 104.二叉树的最大深度 111.二叉树的最小深度 完全二叉树的节点个数
刷题笔记day16
104.二叉树的最大深度
文章讲解:代码随想录
是否自己做出来通过全部用例:是
遇到的困难/犯的错误
想到的是用层序遍历的迭代法来做。
自己写的代码
层序遍历:
class Solution {
public:
int maxDepth(TreeNode* root) {
queue<TreeNode*> que;
if (!root) return 0;
que.push(root);
int depth = 0;
while (!que.empty()) {
++depth;
int size = que.size();
while (size--) {
TreeNode* node = que.front();
que.pop();
if (node-> ...
代码随想录算法训练营day15(day16补) | 二叉树的层序遍历 翻转二叉树 对称二叉树
刷题笔记day15
二叉树的层序遍历
文章讲解:代码随想录
是否自己做出来通过全部用例:是
自己写的代码
迭代法:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> res;
if (root) que.push(root);
while (!que.empty()) {
vector<int> vec;
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.po ...