Skip to content

Commit

Permalink
update /_posts
Browse files Browse the repository at this point in the history
  • Loading branch information
lxxinli committed Jan 7, 2025
1 parent 7ef27cb commit 7380534
Showing 1 changed file with 147 additions and 10 deletions.
157 changes: 147 additions & 10 deletions _posts/2024-12-09-算法学习自用板子.md
Original file line number Diff line number Diff line change
Expand Up @@ -1013,17 +1013,11 @@ int main()
#### 算法设计
构造 $B$ 数组:
差分其实可以看作是前缀和操作的逆运算。
使得:$a_i = b_1+b_2+...+b_i$
通过构造 $B$ 数组:使得:$a_i = b_1+b_2+...+b_i$,那么我们对 $B$ 数组进行一次前缀和操作就可以得到 $a_i$。那么就可以在 $O(n)$ 的时间由 $B$ 数组反推出 $A$ 数组。
那么我们对 $B$ 数组进行一次前缀和操作就可以得到 $a_i$。
那么就可以在 $O(n)$ 的时间由 $B$ 数组反推出 $A$ 数组。
$B$ 数组有一个好处,可以在 $O(1)$ 的时间里将 $[l, r]$ 中每一个数加上 $c$ 。
通过令 $b_l + c$ , $b_{r+1} - c$ 即可。
$B$ 数组有一个好处,可以在 $O(1)$ 的时间里将 $[l, r]$ 中每一个数加上 $c$ :通过令 $b_l + c,b_{r+1} - c$ 即可。
#### 朴素解法 C++ 代码
Expand Down Expand Up @@ -1225,6 +1219,96 @@ int main()



---



## 滑动窗口

### LeetCode 3. 无重复字符的最长子串

#### 题目描述

>### 3. 无重复字符的最长子串
>
>给定一个字符串 `s` ,请你找出其中不含有重复字符的 **最长 子串** 的长度。
>
>**示例 1:**
>
>```
>输入: s = "abcabcbb"
>输出: 3
>解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
>```
>
>**示例 2:**
>
>```
>输入: s = "bbbbb"
>输出: 1
>解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
>```
>
>**示例 3:**
>
>```
>输入: s = "pwwkew"
>输出: 3
>解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
> 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
>```
>
>**提示:**
>
>- `0 <= s.length <= 5 * 104`
>- `s` 由英文字母、数字、符号和空格组成
#### 算法设计
> [我的精神病一触即发](https://leetcode.cn/u/ruo-chen-380/) 发布于 江苏(编辑过)
>
> 2024.07.31
>
> 我希望这种滑动窗口的模板题,你们不要再写的五花八门了。这是最简单的模板,拿走不谢。 模板:
>
> ```c++
> //外层循环扩展右边界,内层循环扩展左边界
> for (int l = 0, r = 0 ; r < n ; r++) {
> //当前考虑的元素
> while (l <= r && check()) {//区间[left,right]不符合题意
> //扩展左边界
> }
> //区间[left,right]符合题意,统计相关信息
> }
> ```
#### 完整 C++ 代码
```c++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> hash_c;
int ans = 0;
for (int l = 0, r = 0; r < s.size(); r ++)
{
while (hash_c.contains(s[r]))
hash_c.erase(s[l]), l ++;
hash_c.insert(s[r]);
ans = max(ans, r - l + 1);
}
return ans;
}
};
```




---

## 位运算
Expand Down Expand Up @@ -3210,6 +3294,59 @@ int main()


---



## BFS



```c++
vector<vector<int>> levelOrder(TreeNode* root) {
//use queue (non-recursion)
vector<vector<int>> result;
queue<TreeNode*> que;
if(root) que.push(root);
while(!que.empty())
{
//Note: the Size is key
int size = que.size();
vector<int> temp;

while(size --)
{
TreeNode* cur = que.front();
temp.push_back(cur->val);
que.pop();
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
result.push_back(temp);
}
return result;
}
```
---
Expand Down Expand Up @@ -4732,7 +4869,7 @@ int main()
这里求最大值 $m_1$ 和次大值 $m_2$ 可以使用一个技巧:
1. $m_1, m_2$ 初值设置为0(可以保证后续更新后的 $m_1,m_2$ 也是 $>0$ 的)。
1. $m_1, m_2$ 初值设置为 $0$(可以保证后续更新后的 $m_1,m_2$ 也是 $>0$ 的)。
2. 如果每次算出来的 $d \ge m_1$,我们就令 $m_2 = m_1$,$m_1 = d$。(这里更新顺序不能反)
3. 如果每次算出来的 $d < m_1$,但是 $d >m_2$,我们就令 $m_2=d$。
Expand Down

0 comments on commit 7380534

Please sign in to comment.