diff --git a/2024/01/01/leetcode/index.html b/2024/01/01/leetcode/index.html index 869f6d4..dce7d63 100644 --- a/2024/01/01/leetcode/index.html +++ b/2024/01/01/leetcode/index.html @@ -47,7 +47,7 @@ - + @@ -233,7 +233,7 @@ - 85k words + 89k words @@ -244,7 +244,7 @@ - 713 mins + 740 mins @@ -286,7 +286,7 @@

【算法题】LeetCode算法汇总

- Last updated on February 25, 2024 pm + Last updated on February 27, 2024 am

@@ -694,6 +694,19 @@

柱形图中的最大矩形

1
2
3
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
vector<int> minLeft(heights.size());
vector<int> minRight(heights.size());
int size = heights.size();

//记录每个柱子左边第一个小于该柱子的下标
minLeft[0] = -1;
for(int i=1;i<size;i++){
int t= i-1;
while(t>=0&&heights[t]>=heights[i]) t=minLeft[t];
minLeft[i]=t;
}
//记录每个柱右边第一个小于该柱子的下标
minRight[size-1]=size;
for(int i=size -2;i>=0;i--){
int t=i+1;
while(t<size&&heights[t]>=heights[i]) t=minRight[t];
minRight[i]=t;
}

int res=0;
for(int i=0;i<size;i++){
int sum=heights[i]*(minRight[i]-minLeft[i]-1);
res = max(sum,res);
}

return res;
}
};

二叉树

+

构建二叉搜索树并中序遍历

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
#include<vector>
using namespace std;

struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(): val(0), left(nullptr), right(nullptr){}
TreeNode(int val): val(val), left(nullptr), right(nullptr)()
};

TreeNode* search(vector<int> nums){
TreeNode* root = new TreeNode(nums[0]);
for(int i=0;i<nums.size();i++){
TreeNode* n = new TreeNode(nums[i]);
TreeNode* cur = root;
while(cur!=nullptr){
if(nums[i]<cur->val){
if(cur->left==nullptr){cur->left = n; break;}
else(cur = cur->left;)
}else{
if(cur->right==nullptr){cur->right = n; break;}
else(cur = cur->right;)
}
}
}
return root;
}

void inorder(TreeNode* root){
if(root == nullptr) return;
inorder(root->left);
printf("%d ",root->val);
inorder(root->right);
}


int main(){
vector<int> nums=({2,3,4,5,2,1});
TreeNode* st = search(nums);
inorder(root);
return 0;
}
+

验证二叉搜索树

+

思路:对这个树进行中序遍历放进一个数组中如果是从大到小的顺序,那么就认为是二叉搜索树

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
vector<int> nums;
void inorder(TreeNode* root){
if(root == nullptr){
return;
}
inorder(root->left);
nums.push_back(root->val);
inorder(root->right);
}
bool isValidBST(TreeNode* root) {
inorder(root);
for(int i = 1; i < nums.size(); i++){
if(nums[i] <= nums[i - 1]){
return false;
}
}
return true;
}
};
+

二叉搜索树中第K小的元素

+

思路:一样的思路,将二叉搜索树进行存储进一个一维的数组中,然后输出第k-1个元素

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
vector<int> nums;
void inorder(TreeNode* root){
if(root == nullptr){
return;
}
inorder(root->left);
nums.push_back(root->val);
inorder(root->right);
}
int kthSmallest(TreeNode* root, int k) {
inorder(root);
return nums[k-1];
}
};
+

从前序和中序遍历构造二叉树

+

本质上就是利用中序找到每个子串的内容

+

利用前序放入对应的元素,每次都从中取出一个第一个放进结果序列中

+

对于 后序列+中序的思路也是一样

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
//内部实现
TreeNode* build(vector<int>& preorder, vector<int>& inorder, int ps, int pe, int is, int ie){
if(ps >= pe || is >= ie){
return nullptr;
}
//找到第一个元素就是前序遍历的第一个元素
TreeNode* r = new TreeNode(preorder[ps]);
//find inorder partition
//找到中序遍历中的处于位置中间的那个元素
int i;
for(i = is; i < ie; i++){
if(inorder[i] == preorder[ps]){
break;
}
}
r->left = build(preorder, inorder, ps + 1, ps + 1 + (i - is), is, i);
r->right = build(preorder, inorder, ps + 1 + i - is, pe, i + 1, ie);
return r;
}
//最外层的调用
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return build(preorder, inorder, 0, preorder.size(), 0, inorder.size());
}
};

深搜回溯

深度优先搜索的三部曲:

    @@ -1348,6 +1361,17 @@

    买卖股票的最佳时机

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Solution {
    public:
    int maxProfit(vector<int>& prices) {
    int low = INT_MAX;
    int res = 0;
    for(int i =0;i<prices.size(); i++){
    low = min(low, prices[i]);
    res = max(res, prices[i]-low);
    }
    return res;
    }
    };

    动态规划

    1

    +

    乘积最大子数组

    +

    https://leetcode.cn/problems/maximum-product-subarray/description/

    +

    给你一个整数数组 nums +,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

    +

    测试用例的答案是一个 32-位 整数。

    +

    子数组 是数组的连续子序列。

    +
    1
    2
    3
    输入: nums = [2,3,-2,4]
    输出: 6
    解释: 子数组 [2,3] 有最大乘积 6。
    +

    思路:

    +

    因为是乘积的问题,所以会存在如果某个值特别小或者是特别大再负负得正之后仍然会出现最大的情况,因此我们在用动态规划记录的时候不仅要记录最大值还需要记录最小值

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Solution {
    public:
    int maxProduct(vector<int>& nums) {
    vector<int> maxp(nums);
    vector<int> minp(nums);
    int res = nums[0];
    for(int i=1;i<nums.size();i++){
    maxp[i]=max(maxp[i-1]*nums[i], max(nums[i], minp[i-1]*nums[i]));
    res = max(maxp[i], res);
    minp[i]=min(minp[i-1]*nums[i], min(nums[i], maxp[i-1]*nums[i]));
    }
    return res;
    }
    };

    栈&队列&单调栈

    有效括号

    冗余连接II

    Updated on
    -
    February 25, 2024
    +
    February 27, 2024
    diff --git a/2024/01/30/dl_summary/index.html b/2024/01/30/dl_summary/index.html index 065bb95..5808444 100644 --- a/2024/01/30/dl_summary/index.html +++ b/2024/01/30/dl_summary/index.html @@ -25,7 +25,7 @@ - + @@ -211,7 +211,7 @@ @@ -222,7 +222,7 @@ - 48 mins + 75 mins @@ -264,7 +264,7 @@

    【深度学习】DeepL知识汇总

    - Last updated on February 22, 2024 pm + Last updated on February 28, 2024 pm

    @@ -296,6 +296,21 @@

    深度学习知识汇总

    target="_blank" rel="noopener" href="https://blog.csdn.net/kebu12345678/article/details/103084851">https://blog.csdn.net/kebu12345678/article/details/103084851

    https://zhuanlan.zhihu.com/p/667048896

    +

    https://zhuanlan.zhihu.com/p/643560888

    +

    bert模型细节 https://www.zhihu.com/question/534763354

    +

    为什么Bert三个embedding可以相加 https://www.zhihu.com/question/374835153/answer/1080315948

    +

    LLAMA2结构https://blog.csdn.net/sikh_0529/article/details/134375318

    +

    旋转位置嵌入https://www.zhihu.com/tardis/zm/art/647109286?source_id=1005

    +

    Qlora https://zhuanlan.zhihu.com/p/618894919

    +

    RLHF https://zhuanlan.zhihu.com/p/631238431

    +
        [https://zhuanlan.zhihu.com/p/599016986](https://zhuanlan.zhihu.com/p/599016986)

    逻辑回归和线性回归

    线性回归解决的是回归问题,逻辑回归相当于是线性回归的基础上,来解决分类问题

    线性回归(Linear Regression) \[ @@ -355,7 +370,6 @@

    实现参数稀疏

  1. 学习率过大
  2. 训练样本中有坏数据
-
  • model.eval vs和torch.no_grad区别