mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
Merge branch 'youngyangyang04:master' into master
This commit is contained in:
@ -240,7 +240,7 @@ class Solution {
|
||||
while (left - 1 >= 0 && nums[left - 1] == nums[index]) { // 防止数组越界。逻辑短路,两个条件顺序不能换
|
||||
left--;
|
||||
}
|
||||
// 向左滑动,找右边界
|
||||
// 向右滑动,找右边界
|
||||
while (right + 1 < nums.length && nums[right + 1] == nums[index]) { // 防止数组越界。
|
||||
right++;
|
||||
}
|
||||
|
@ -98,6 +98,8 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
// 时间复杂度: 最差情况所有元素都是唯一的。复杂度和全排列1都是 O(n! * n) 对于 n 个元素一共有 n! 中排列方案。而对于每一个答案,我们需要 O(n) 去复制最终放到 result 数组
|
||||
// 空间复杂度: O(n) 回溯树的深度取决于我们有多少个元素
|
||||
```
|
||||
* 时间复杂度: O(n)
|
||||
* 空间复杂度: O(n)
|
||||
|
@ -18,7 +18,7 @@
|
||||
|
||||
## 思路
|
||||
|
||||
这道题目和1020. 飞地的数量正好反过来了,[1020. 飞地的数量](https://leetcode.cn/problems/number-of-enclaves/solution/by-carlsun-2-7lt9/)是求 地图中间的空格数,而本题是要把地图中间的'O'都改成'X'。
|
||||
这道题目和1020. 飞地的数量正好反过来了,[1020. 飞地的数量](https://programmercarl.com/1020.%E9%A3%9E%E5%9C%B0%E7%9A%84%E6%95%B0%E9%87%8F.html)是求 地图中间的空格数,而本题是要把地图中间的'O'都改成'X'。
|
||||
|
||||
那么两题在思路上也是差不多的。
|
||||
|
||||
|
@ -496,7 +496,24 @@ function wordBreak(s: string, wordDict: string[]): boolean {
|
||||
};
|
||||
```
|
||||
|
||||
Rust:
|
||||
|
||||
```rust
|
||||
impl Solution {
|
||||
pub fn word_break(s: String, word_dict: Vec<String>) -> bool {
|
||||
let mut dp = vec![false; s.len() + 1];
|
||||
dp[0] = true;
|
||||
for i in 1..=s.len() {
|
||||
for j in 0..i {
|
||||
if word_dict.iter().any(|word| *word == s[j..i]) && dp[j] {
|
||||
dp[i] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
dp[s.len()]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<p align="center">
|
||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||
|
@ -314,7 +314,24 @@ function rob(nums: number[]): number {
|
||||
};
|
||||
```
|
||||
|
||||
Rust:
|
||||
|
||||
```rust
|
||||
impl Solution {
|
||||
pub fn rob(nums: Vec<i32>) -> i32 {
|
||||
if nums.len() == 1 {
|
||||
return nums[0];
|
||||
}
|
||||
let mut dp = vec![0; nums.len()];
|
||||
dp[0] = nums[0];
|
||||
dp[1] = nums[0].max(nums[1]);
|
||||
for i in 2..nums.len() {
|
||||
dp[i] = (dp[i - 2] + nums[i]).max(dp[i - 1]);
|
||||
}
|
||||
dp[nums.len() - 1]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
<p align="center">
|
||||
|
@ -41,7 +41,7 @@
|
||||
|
||||
### 深度优先搜索
|
||||
|
||||
以下代码使用dfs实现,如果对dfs不太了解的话,建议先看这篇题解:[797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/),
|
||||
以下代码使用dfs实现,如果对dfs不太了解的话,建议先看这篇题解:[797.所有可能的路径](https://programmercarl.com/0797.%E6%89%80%E6%9C%89%E5%8F%AF%E8%83%BD%E7%9A%84%E8%B7%AF%E5%BE%84.html),
|
||||
|
||||
C++代码如下:
|
||||
|
||||
|
@ -390,6 +390,8 @@ public:
|
||||
|
||||
```Java
|
||||
//解法一
|
||||
|
||||
//方式一
|
||||
class Solution {
|
||||
/**
|
||||
* 递归法
|
||||
@ -428,9 +430,32 @@ class Solution {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//方式二
|
||||
class Solution {
|
||||
|
||||
List<String> result = new ArrayList<>();
|
||||
|
||||
public List<String> binaryTreePaths(TreeNode root) {
|
||||
deal(root, "");
|
||||
return result;
|
||||
}
|
||||
|
||||
public void deal(TreeNode node, String s) {
|
||||
if (node == null)
|
||||
return;
|
||||
if (node.left == null && node.right == null) {
|
||||
result.add(new StringBuilder(s).append(node.val).toString());
|
||||
return;
|
||||
}
|
||||
String tmp = new StringBuilder(s).append(node.val).append("->").toString();
|
||||
deal(node.left, tmp);
|
||||
deal(node.right, tmp);
|
||||
}
|
||||
}
|
||||
```
|
||||
```java
|
||||
// 解法2
|
||||
// 解法二
|
||||
class Solution {
|
||||
/**
|
||||
* 迭代法
|
||||
|
@ -177,15 +177,19 @@ class Solution {
|
||||
for (int j = 0; j <= n; j++) {
|
||||
dp[j] = max;
|
||||
}
|
||||
//如果不想要寫for-loop填充數組的話,也可以用JAVA內建的Arrays.fill()函數。
|
||||
//Arrays.fill(dp, Integer.MAX_VALUE);
|
||||
|
||||
//当和为0时,组合的个数为0
|
||||
dp[0] = 0;
|
||||
// 遍历物品
|
||||
for (int i = 1; i * i <= n; i++) {
|
||||
// 遍历背包
|
||||
for (int j = i * i; j <= n; j++) {
|
||||
if (dp[j - i * i] != max) {
|
||||
//if (dp[j - i * i] != max) {
|
||||
dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
|
||||
}
|
||||
//}
|
||||
//不需要這個if statement,因爲在完全平方數這一題不會有"湊不成"的狀況發生( 一定可以用"1"來組成任何一個n),故comment掉這個if statement。
|
||||
}
|
||||
}
|
||||
return dp[n];
|
||||
@ -356,6 +360,7 @@ var numSquares2 = function(n) {
|
||||
TypeScript:
|
||||
|
||||
```typescript
|
||||
// 先遍历物品
|
||||
function numSquares(n: number): number {
|
||||
const goodsNum: number = Math.floor(Math.sqrt(n));
|
||||
const dp: number[] = new Array(n + 1).fill(Infinity);
|
||||
@ -370,6 +375,64 @@ function numSquares(n: number): number {
|
||||
};
|
||||
```
|
||||
|
||||
```rust
|
||||
// 先遍历背包
|
||||
function numSquares(n: number): number {
|
||||
const dp = Array(n + 1).fill(Infinity)
|
||||
dp[0] = 0;
|
||||
for(let i = 1; i <= n; i++){
|
||||
for(let j = 1; j * j <= i; j++){
|
||||
dp[i] = Math.min(dp[i], dp[i -j * j] + 1)
|
||||
}
|
||||
}
|
||||
return dp[n]
|
||||
};
|
||||
```
|
||||
|
||||
Rust:
|
||||
|
||||
```rust
|
||||
// 先遍历背包
|
||||
impl Solution {
|
||||
pub fn num_squares(n: i32) -> i32 {
|
||||
let n = n as usize;
|
||||
let mut dp = vec![i32::MAX; n + 1];
|
||||
dp[0] = 0;
|
||||
for i in 0..=n {
|
||||
let mut j = 1;
|
||||
loop {
|
||||
match j * j > i {
|
||||
true => break,
|
||||
false => dp[i] = dp[i].min(dp[i - j * j] + 1),
|
||||
}
|
||||
j += 1;
|
||||
}
|
||||
}
|
||||
dp[n]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```rust
|
||||
// 先遍历物品
|
||||
impl Solution {
|
||||
pub fn num_squares(n: i32) -> i32 {
|
||||
let (n, mut goods) = (n as usize, 1);
|
||||
let mut dp = vec![i32::MAX; n + 1];
|
||||
dp[0] = 0;
|
||||
loop {
|
||||
if goods * goods > n {
|
||||
break;
|
||||
}
|
||||
for j in goods * goods..=n {
|
||||
dp[j] = dp[j].min(dp[j - goods * goods] + 1);
|
||||
}
|
||||
goods += 1;
|
||||
}
|
||||
dp[n]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
<p align="center">
|
||||
|
@ -148,6 +148,8 @@ class Solution {
|
||||
```
|
||||
|
||||
Python:
|
||||
|
||||
DP
|
||||
```python
|
||||
class Solution:
|
||||
def lengthOfLIS(self, nums: List[int]) -> int:
|
||||
@ -162,7 +164,31 @@ class Solution:
|
||||
result = max(result, dp[i]) #取长的子序列
|
||||
return result
|
||||
```
|
||||
贪心
|
||||
```python
|
||||
class Solution:
|
||||
def lengthOfLIS(self, nums: List[int]) -> int:
|
||||
if len(nums) <= 1:
|
||||
return len(nums)
|
||||
|
||||
tails = [nums[0]] # 存储递增子序列的尾部元素
|
||||
for num in nums[1:]:
|
||||
if num > tails[-1]:
|
||||
tails.append(num) # 如果当前元素大于递增子序列的最后一个元素,直接加入到子序列末尾
|
||||
else:
|
||||
# 使用二分查找找到当前元素在递增子序列中的位置,并替换对应位置的元素
|
||||
left, right = 0, len(tails) - 1
|
||||
while left < right:
|
||||
mid = (left + right) // 2
|
||||
if tails[mid] < num:
|
||||
left = mid + 1
|
||||
else:
|
||||
right = mid
|
||||
tails[left] = num
|
||||
|
||||
return len(tails) # 返回递增子序列的长度
|
||||
|
||||
```
|
||||
Go:
|
||||
```go
|
||||
// 动态规划求解
|
||||
|
@ -248,23 +248,51 @@ class Solution {
|
||||
```
|
||||
|
||||
Python:
|
||||
|
||||
版本一
|
||||
```python
|
||||
from typing import List
|
||||
|
||||
class Solution:
|
||||
def maxProfit(self, prices: List[int]) -> int:
|
||||
n = len(prices)
|
||||
if n == 0:
|
||||
return 0
|
||||
dp = [[0] * 4 for _ in range(n)]
|
||||
dp[0][0] = -prices[0] #持股票
|
||||
dp = [[0] * 4 for _ in range(n)] # 创建动态规划数组,4个状态分别表示持有股票、不持有股票且处于冷冻期、不持有股票且不处于冷冻期、不持有股票且当天卖出后处于冷冻期
|
||||
dp[0][0] = -prices[0] # 初始状态:第一天持有股票的最大利润为买入股票的价格
|
||||
for i in range(1, n):
|
||||
dp[i][0] = max(dp[i-1][0], max(dp[i-1][3], dp[i-1][1]) - prices[i])
|
||||
dp[i][1] = max(dp[i-1][1], dp[i-1][3])
|
||||
dp[i][2] = dp[i-1][0] + prices[i]
|
||||
dp[i][3] = dp[i-1][2]
|
||||
return max(dp[n-1][3], dp[n-1][1], dp[n-1][2])
|
||||
```
|
||||
dp[i][0] = max(dp[i-1][0], max(dp[i-1][3], dp[i-1][1]) - prices[i]) # 当前持有股票的最大利润等于前一天持有股票的最大利润或者前一天不持有股票且不处于冷冻期的最大利润减去当前股票的价格
|
||||
dp[i][1] = max(dp[i-1][1], dp[i-1][3]) # 当前不持有股票且处于冷冻期的最大利润等于前一天持有股票的最大利润加上当前股票的价格
|
||||
dp[i][2] = dp[i-1][0] + prices[i] # 当前不持有股票且不处于冷冻期的最大利润等于前一天不持有股票的最大利润或者前一天处于冷冻期的最大利润
|
||||
dp[i][3] = dp[i-1][2] # 当前不持有股票且当天卖出后处于冷冻期的最大利润等于前一天不持有股票且不处于冷冻期的最大利润
|
||||
return max(dp[n-1][3], dp[n-1][1], dp[n-1][2]) # 返回最后一天不持有股票的最大利润
|
||||
|
||||
```
|
||||
版本二
|
||||
```python
|
||||
class Solution:
|
||||
def maxProfit(self, prices: List[int]) -> int:
|
||||
n = len(prices)
|
||||
if n < 2:
|
||||
return 0
|
||||
|
||||
# 定义三种状态的动态规划数组
|
||||
dp = [[0] * 3 for _ in range(n)]
|
||||
dp[0][0] = -prices[0] # 持有股票的最大利润
|
||||
dp[0][1] = 0 # 不持有股票,且处于冷冻期的最大利润
|
||||
dp[0][2] = 0 # 不持有股票,不处于冷冻期的最大利润
|
||||
|
||||
for i in range(1, n):
|
||||
# 当前持有股票的最大利润等于前一天持有股票的最大利润或者前一天不持有股票且不处于冷冻期的最大利润减去当前股票的价格
|
||||
dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i])
|
||||
# 当前不持有股票且处于冷冻期的最大利润等于前一天持有股票的最大利润加上当前股票的价格
|
||||
dp[i][1] = dp[i-1][0] + prices[i]
|
||||
# 当前不持有股票且不处于冷冻期的最大利润等于前一天不持有股票的最大利润或者前一天处于冷冻期的最大利润
|
||||
dp[i][2] = max(dp[i-1][2], dp[i-1][1])
|
||||
|
||||
# 返回最后一天不持有股票的最大利润
|
||||
return max(dp[-1][1], dp[-1][2])
|
||||
|
||||
```
|
||||
Go:
|
||||
```go
|
||||
// 最佳买卖股票时机含冷冻期 动态规划
|
||||
|
@ -355,23 +355,52 @@ func min(a, b int) int {
|
||||
Rust:
|
||||
|
||||
```rust
|
||||
pub fn coin_change(coins: Vec<i32>, amount: i32) -> i32 {
|
||||
let amount = amount as usize;
|
||||
let mut dp = vec![i32::MAX; amount + 1];
|
||||
dp[0] = 0;
|
||||
for i in 0..coins.len() {
|
||||
for j in coins[i] as usize..=amount {
|
||||
if dp[j - coins[i] as usize] != i32::MAX {
|
||||
dp[j] = dp[j].min(dp[j - coins[i] as usize] + 1);
|
||||
// 遍历物品
|
||||
impl Solution {
|
||||
pub fn coin_change(coins: Vec<i32>, amount: i32) -> i32 {
|
||||
let amount = amount as usize;
|
||||
let mut dp = vec![i32::MAX; amount + 1];
|
||||
dp[0] = 0;
|
||||
for coin in coins {
|
||||
for i in coin as usize..=amount {
|
||||
if dp[i - coin as usize] != i32::MAX {
|
||||
dp[i] = dp[i].min(dp[i - coin as usize] + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if dp[amount] == i32::MAX {
|
||||
return -1;
|
||||
}
|
||||
dp[amount]
|
||||
}
|
||||
if dp[amount] == i32::MAX { -1 } else { dp[amount] }
|
||||
}
|
||||
```
|
||||
|
||||
```rust
|
||||
// 遍历背包
|
||||
impl Solution {
|
||||
pub fn coin_change(coins: Vec<i32>, amount: i32) -> i32 {
|
||||
let amount = amount as usize;
|
||||
let mut dp = vec![i32::MAX; amount + 1];
|
||||
dp[0] = 0;
|
||||
for i in 1..=amount {
|
||||
for &coin in &coins {
|
||||
if i >= coin as usize && dp[i - coin as usize] != i32::MAX {
|
||||
dp[i] = dp[i].min(dp[i - coin as usize] + 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
if dp[amount] == i32::MAX {
|
||||
return -1;
|
||||
}
|
||||
dp[amount]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Javascript:
|
||||
```javascript
|
||||
// 遍历物品
|
||||
const coinChange = (coins, amount) => {
|
||||
if(!amount) {
|
||||
return 0;
|
||||
@ -380,7 +409,7 @@ const coinChange = (coins, amount) => {
|
||||
let dp = Array(amount + 1).fill(Infinity);
|
||||
dp[0] = 0;
|
||||
|
||||
for(let i =0; i < coins.length; i++) {
|
||||
for(let i = 0; i < coins.length; i++) {
|
||||
for(let j = coins[i]; j <= amount; j++) {
|
||||
dp[j] = Math.min(dp[j - coins[i]] + 1, dp[j]);
|
||||
}
|
||||
@ -390,9 +419,26 @@ const coinChange = (coins, amount) => {
|
||||
}
|
||||
```
|
||||
|
||||
```javascript
|
||||
// 遍历背包
|
||||
var coinChange = function(coins, amount) {
|
||||
const dp = Array(amount + 1).fill(Infinity)
|
||||
dp[0] = 0
|
||||
for (let i = 1; i <= amount; i++) {
|
||||
for (let j = 0; j < coins.length; j++) {
|
||||
if (i >= coins[j] && dp[i - coins[j]] !== Infinity) {
|
||||
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[amount] === Infinity ? -1 : dp[amount]
|
||||
}
|
||||
```
|
||||
|
||||
TypeScript:
|
||||
|
||||
```typescript
|
||||
// 遍历物品
|
||||
function coinChange(coins: number[], amount: number): number {
|
||||
const dp: number[] = new Array(amount + 1).fill(Infinity);
|
||||
dp[0] = 0;
|
||||
@ -406,6 +452,23 @@ function coinChange(coins: number[], amount: number): number {
|
||||
};
|
||||
```
|
||||
|
||||
```typescript
|
||||
// 遍历背包
|
||||
function coinChange(coins: number[], amount: number): number {
|
||||
const dp: number[] = Array(amount + 1).fill(Infinity)
|
||||
dp[0] = 0
|
||||
for (let i = 1; i <= amount; i++) {
|
||||
for (let j = 0; j < coins.length; j++) {
|
||||
if (i >= coins[j] && dp[i - coins[j]] !== Infinity) {
|
||||
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[amount] === Infinity ? -1 : dp[amount]
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
<p align="center">
|
||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||
|
@ -146,6 +146,7 @@ class Solution {
|
||||
|
||||
```
|
||||
|
||||
Python:
|
||||
(版本一)使用数组
|
||||
```python
|
||||
class Solution:
|
||||
@ -210,7 +211,6 @@ class Solution:
|
||||
class Solution:
|
||||
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
|
||||
return all(ransomNote.count(c) <= magazine.count(c) for c in set(ransomNote))
|
||||
|
||||
```
|
||||
|
||||
Go:
|
||||
|
@ -140,7 +140,7 @@ public:
|
||||
|
||||
按照这样的逻辑,就可以写出如下遍历代码:(详细注释)
|
||||
|
||||
(如果对dfs基础内容就不懂,建议看 [「代码随想录」DFS算法精讲!](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/),还可以顺便解决 797. 所有可能的路径)
|
||||
(如果对dfs基础内容就不懂,建议看 [「代码随想录」DFS算法精讲!](https://programmercarl.com/图论深搜理论基础.html),还可以顺便解决 [797. 所有可能的路径](https://programmercarl.com/0797.%E6%89%80%E6%9C%89%E5%8F%AF%E8%83%BD%E7%9A%84%E8%B7%AF%E5%BE%84.html))
|
||||
|
||||
```CPP
|
||||
class Solution {
|
||||
|
@ -3,6 +3,9 @@
|
||||
<img src="../pics/训练营.png" width="1000"/>
|
||||
</a>
|
||||
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
|
||||
|
||||
|
||||
|
||||
# 463. 岛屿的周长
|
||||
|
||||
[力扣题目链接](https://leetcode.cn/problems/island-perimeter/)
|
||||
|
@ -208,7 +208,7 @@ public static int findLengthOfLCIS(int[] nums) {
|
||||
|
||||
Python:
|
||||
|
||||
> 动态规划:
|
||||
DP
|
||||
```python
|
||||
class Solution:
|
||||
def findLengthOfLCIS(self, nums: List[int]) -> int:
|
||||
@ -223,8 +223,27 @@ class Solution:
|
||||
return result
|
||||
```
|
||||
|
||||
DP(优化版)
|
||||
```python
|
||||
class Solution:
|
||||
def findLengthOfLCIS(self, nums: List[int]) -> int:
|
||||
if not nums:
|
||||
return 0
|
||||
|
||||
> 贪心法:
|
||||
max_length = 1
|
||||
current_length = 1
|
||||
|
||||
for i in range(1, len(nums)):
|
||||
if nums[i] > nums[i - 1]:
|
||||
current_length += 1
|
||||
max_length = max(max_length, current_length)
|
||||
else:
|
||||
current_length = 1
|
||||
|
||||
return max_length
|
||||
|
||||
```
|
||||
贪心
|
||||
```python
|
||||
class Solution:
|
||||
def findLengthOfLCIS(self, nums: List[int]) -> int:
|
||||
|
@ -131,9 +131,11 @@ private:
|
||||
}
|
||||
// 将v->u 这条边加入并查集
|
||||
void join(int u, int v) {
|
||||
if (isSame(u, v)) return ;
|
||||
u = find(u); // 寻找u的根
|
||||
v = find(v); // 寻找v的根
|
||||
if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回
|
||||
father[v] = u;
|
||||
}
|
||||
}
|
||||
public:
|
||||
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
|
||||
init();
|
||||
|
@ -35,8 +35,8 @@
|
||||
|
||||
本题思路上比较简单,难点其实都是 dfs 和 bfs的理论基础,关于理论基础我在这里都有详细讲解 :
|
||||
|
||||
* [DFS理论基础](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/)
|
||||
* [BFS理论基础](https://leetcode.cn/circle/discuss/V3FulB/)
|
||||
* [DFS理论基础](https://programmercarl.com/图论深搜理论基础.html)
|
||||
* [BFS理论基础](https://programmercarl.com/图论广搜理论基础.html)
|
||||
|
||||
## DFS
|
||||
|
||||
@ -136,7 +136,7 @@ public:
|
||||
|
||||
## BFS
|
||||
|
||||
关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](https://leetcode.cn/circle/discuss/V3FulB/)
|
||||
关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](https://programmercarl.com/图论广搜理论基础.html)
|
||||
|
||||
本题BFS代码如下:
|
||||
|
||||
|
@ -302,37 +302,99 @@ class Solution {
|
||||
|
||||
Python:
|
||||
|
||||
> 动态规划:
|
||||
2维DP
|
||||
```python
|
||||
class Solution:
|
||||
def findLength(self, A: List[int], B: List[int]) -> int:
|
||||
dp = [[0] * (len(B)+1) for _ in range(len(A)+1)]
|
||||
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
|
||||
# 创建一个二维数组 dp,用于存储最长公共子数组的长度
|
||||
dp = [[0] * (len(nums2) + 1) for _ in range(len(nums1) + 1)]
|
||||
# 记录最长公共子数组的长度
|
||||
result = 0
|
||||
for i in range(1, len(A)+1):
|
||||
for j in range(1, len(B)+1):
|
||||
if A[i-1] == B[j-1]:
|
||||
dp[i][j] = dp[i-1][j-1] + 1
|
||||
result = max(result, dp[i][j])
|
||||
|
||||
# 遍历数组 nums1
|
||||
for i in range(1, len(nums1) + 1):
|
||||
# 遍历数组 nums2
|
||||
for j in range(1, len(nums2) + 1):
|
||||
# 如果 nums1[i-1] 和 nums2[j-1] 相等
|
||||
if nums1[i - 1] == nums2[j - 1]:
|
||||
# 在当前位置上的最长公共子数组长度为前一个位置上的长度加一
|
||||
dp[i][j] = dp[i - 1][j - 1] + 1
|
||||
# 更新最长公共子数组的长度
|
||||
if dp[i][j] > result:
|
||||
result = dp[i][j]
|
||||
|
||||
# 返回最长公共子数组的长度
|
||||
return result
|
||||
|
||||
```
|
||||
|
||||
> 动态规划:滚动数组
|
||||
1维DP
|
||||
```python
|
||||
class Solution:
|
||||
def findLength(self, A: List[int], B: List[int]) -> int:
|
||||
dp = [0] * (len(B) + 1)
|
||||
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
|
||||
# 创建一个一维数组 dp,用于存储最长公共子数组的长度
|
||||
dp = [0] * (len(nums2) + 1)
|
||||
# 记录最长公共子数组的长度
|
||||
result = 0
|
||||
for i in range(1, len(A)+1):
|
||||
for j in range(len(B), 0, -1):
|
||||
if A[i-1] == B[j-1]:
|
||||
dp[j] = dp[j-1] + 1
|
||||
|
||||
# 遍历数组 nums1
|
||||
for i in range(1, len(nums1) + 1):
|
||||
# 用于保存上一个位置的值
|
||||
prev = 0
|
||||
# 遍历数组 nums2
|
||||
for j in range(1, len(nums2) + 1):
|
||||
# 保存当前位置的值,因为会在后面被更新
|
||||
current = dp[j]
|
||||
# 如果 nums1[i-1] 和 nums2[j-1] 相等
|
||||
if nums1[i - 1] == nums2[j - 1]:
|
||||
# 在当前位置上的最长公共子数组长度为上一个位置的长度加一
|
||||
dp[j] = prev + 1
|
||||
# 更新最长公共子数组的长度
|
||||
if dp[j] > result:
|
||||
result = dp[j]
|
||||
else:
|
||||
dp[j] = 0 #注意这里不相等的时候要有赋0的操作
|
||||
result = max(result, dp[j])
|
||||
# 如果不相等,将当前位置的值置为零
|
||||
dp[j] = 0
|
||||
# 更新 prev 变量为当前位置的值,供下一次迭代使用
|
||||
prev = current
|
||||
|
||||
# 返回最长公共子数组的长度
|
||||
return result
|
||||
|
||||
```
|
||||
|
||||
2维DP 扩展
|
||||
```python
|
||||
class Solution:
|
||||
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
|
||||
# 创建一个二维数组 dp,用于存储最长公共子数组的长度
|
||||
dp = [[0] * (len(nums2) + 1) for _ in range(len(nums1) + 1)]
|
||||
# 记录最长公共子数组的长度
|
||||
result = 0
|
||||
|
||||
# 对第一行和第一列进行初始化
|
||||
for i in range(len(nums1)):
|
||||
if nums1[i] == nums2[0]:
|
||||
dp[i + 1][1] = 1
|
||||
for j in range(len(nums2)):
|
||||
if nums1[0] == nums2[j]:
|
||||
dp[1][j + 1] = 1
|
||||
|
||||
# 填充dp数组
|
||||
for i in range(1, len(nums1) + 1):
|
||||
for j in range(1, len(nums2) + 1):
|
||||
if nums1[i - 1] == nums2[j - 1]:
|
||||
# 如果 nums1[i-1] 和 nums2[j-1] 相等,则当前位置的最长公共子数组长度为左上角位置的值加一
|
||||
dp[i][j] = dp[i - 1][j - 1] + 1
|
||||
if dp[i][j] > result:
|
||||
# 更新最长公共子数组的长度
|
||||
result = dp[i][j]
|
||||
|
||||
# 返回最长公共子数组的长度
|
||||
return result
|
||||
|
||||
|
||||
```
|
||||
Go:
|
||||
```Go
|
||||
func findLength(A []int, B []int) int {
|
||||
|
@ -39,7 +39,7 @@
|
||||
|
||||
每改变一个0的方格,都需要重新计算一个地图的最大面积,所以 整体时间复杂度为:n^4。
|
||||
|
||||
如果对深度优先搜索不了解的录友,可以看这里:[深度优先搜索精讲](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/)
|
||||
如果对深度优先搜索不了解的录友,可以看这里:[深度优先搜索精讲](https://programmercarl.com/图论深搜理论基础.html)
|
||||
|
||||
|
||||
## 优化思路
|
||||
|
@ -56,7 +56,7 @@
|
||||
|
||||
所以本题是一个有向图搜索全路径的问题。 只能用深搜(DFS)或者广搜(BFS)来搜。
|
||||
|
||||
关于DFS的理论,如果大家有困惑,可以先看我这篇题解: [DFS理论基础](https://programmercarl.com/%E5%9B%BE%E8%AE%BA%E6%B7%B1%E6%90%9C%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html)
|
||||
关于DFS的理论,如果大家有困惑,可以先看我这篇题解: [DFS理论基础](https://programmercarl.com/图论深搜理论基础.html)
|
||||
|
||||
**以下dfs分析 大家一定要仔细看,本题有两种dfs的解法,很多题解没有讲清楚**。 看完之后 相信你对dfs会有更深的理解。
|
||||
|
||||
|
@ -195,9 +195,9 @@ var largestSumAfterKNegations = function(nums, k) {
|
||||
nums[nums.length-1] = - nums[nums.length-1]
|
||||
k--;
|
||||
}
|
||||
return nums.reduce((a, b) => {
|
||||
a + b
|
||||
})
|
||||
|
||||
// 使用箭头函数的隐式返回值时,需使用简写省略花括号,否则要在 a + b 前加上 return
|
||||
return nums.reduce((a, b) => a + b)
|
||||
};
|
||||
|
||||
// 版本二 (优化: 一次遍历)
|
||||
|
@ -42,7 +42,8 @@
|
||||
|
||||
然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。
|
||||
|
||||
如果对深搜或者广搜不够了解,建议先看这里:[深度优先搜索精讲](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/),[广度优先搜索精讲](https://leetcode.cn/circle/discuss/V3FulB/)
|
||||
如果对深搜或者广搜不够了解,建议先看这里:[深度优先搜索精讲](https://programmercarl.com/图论深搜理论基础.html),[广度优先搜索精讲](https://programmercarl.com/图论广搜理论基础.html)。
|
||||
|
||||
|
||||
采用深度优先搜索的代码如下:
|
||||
|
||||
|
@ -203,21 +203,49 @@ class Solution {
|
||||
```
|
||||
|
||||
Python:
|
||||
|
||||
2维DP
|
||||
```python
|
||||
class Solution:
|
||||
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
|
||||
len1, len2 = len(text1)+1, len(text2)+1
|
||||
dp = [[0 for _ in range(len1)] for _ in range(len2)] # 先对dp数组做初始化操作
|
||||
for i in range(1, len2):
|
||||
for j in range(1, len1): # 开始列出状态转移方程
|
||||
if text1[j-1] == text2[i-1]:
|
||||
dp[i][j] = dp[i-1][j-1]+1
|
||||
# 创建一个二维数组 dp,用于存储最长公共子序列的长度
|
||||
dp = [[0] * (len(text2) + 1) for _ in range(len(text1) + 1)]
|
||||
|
||||
# 遍历 text1 和 text2,填充 dp 数组
|
||||
for i in range(1, len(text1) + 1):
|
||||
for j in range(1, len(text2) + 1):
|
||||
if text1[i - 1] == text2[j - 1]:
|
||||
# 如果 text1[i-1] 和 text2[j-1] 相等,则当前位置的最长公共子序列长度为左上角位置的值加一
|
||||
dp[i][j] = dp[i - 1][j - 1] + 1
|
||||
else:
|
||||
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
|
||||
return dp[-1][-1]
|
||||
```
|
||||
# 如果 text1[i-1] 和 text2[j-1] 不相等,则当前位置的最长公共子序列长度为上方或左方的较大值
|
||||
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
|
||||
|
||||
# 返回最长公共子序列的长度
|
||||
return dp[len(text1)][len(text2)]
|
||||
|
||||
```
|
||||
1维DP
|
||||
```python
|
||||
class Solution:
|
||||
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
|
||||
m, n = len(text1), len(text2)
|
||||
dp = [0] * (n + 1) # 初始化一维DP数组
|
||||
|
||||
for i in range(1, m + 1):
|
||||
prev = 0 # 保存上一个位置的最长公共子序列长度
|
||||
for j in range(1, n + 1):
|
||||
curr = dp[j] # 保存当前位置的最长公共子序列长度
|
||||
if text1[i - 1] == text2[j - 1]:
|
||||
# 如果当前字符相等,则最长公共子序列长度加一
|
||||
dp[j] = prev + 1
|
||||
else:
|
||||
# 如果当前字符不相等,则选择保留前一个位置的最长公共子序列长度中的较大值
|
||||
dp[j] = max(dp[j], dp[j - 1])
|
||||
prev = curr # 更新上一个位置的最长公共子序列长度
|
||||
|
||||
return dp[n] # 返回最后一个位置的最长公共子序列长度作为结果
|
||||
|
||||
```
|
||||
|
||||
Go:
|
||||
```Go
|
||||
|
131
problems/qita/kstar.md
Normal file
131
problems/qita/kstar.md
Normal file
@ -0,0 +1,131 @@
|
||||
# 代码随想录知识星球
|
||||
|
||||
前一阵知识星球刚刚发布了[星球精华-大厂八股文(第三版)](https://programmercarl.com/other/kstar_baguwen.html)
|
||||
|
||||
这份八股文,就有30w字,将近400张思维导图,表格,分析图,整个PDF将近900页的篇幅。
|
||||
|
||||
这些其实都是星球录友们,每日打卡的内容,但这我也仅仅是整理了一部分,因为信息量确实巨大。
|
||||
|
||||
目前星球里已经有将近1000 个精华帖:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221028105054.png' width=500 alt=''> </img></div>
|
||||
|
||||
同时还有[计算机2023届求职薪资PDF](https://programmercarl.com/other/2022salary.html)等一些列独家资料,都在星期置顶帖里:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230516112821.png' width=500 alt=''> </img></div>
|
||||
|
||||
星球里的录友都可以得到我1V1的指导,**我已经详细回答了7000+个问题**: (这个回答问题数量,可以看出我有劳模的潜质 哈哈)
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230426103803.png' width=500 alt=''> </img></div>
|
||||
|
||||
有的时候,大家还是需要过来人,给指点一点,甚至是“踹一脚” 就会想清楚很多。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220215164352.png' width=500 alt=''> </img></div>
|
||||
|
||||
不仅我回答问题,我还会邀请星球里各个方向的录友来和大家一起交流具体技术问题,这个就是星球导师计划: (如果想提问的话,也在星球置顶1可以找到链接)
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230516113144.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230516113058.png' width=500 alt=''> </img></div>
|
||||
|
||||
可以看看星球导师计划里具体的问答:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230516115057.png' width=500 alt=''> </img></div>
|
||||
|
||||
同时我还给录友们至少修改了上千份的简历,我也总结了很多大家写简历上问题。在 「写简历」这个tab上,可以找到我总结的所有问题和简历模板
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220516160018.png' width=500 alt=''> </img></div>
|
||||
|
||||
【专业技能】【项目经验】【自我评价】都应该怎么写,面试时候 自我介绍,应该怎么说,我都给出了我的建议:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220516155906.png' width=500 alt=''> </img></div>
|
||||
|
||||
|
||||
如果你还在犹豫要不要加入的话,**可以进来体验三天,三天内点击知识星球APP右上角,可以自助全额退款**。 绝对不会坑大家!
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230607171843.png' width=400 alt=''> </img></div>
|
||||
|
||||
|
||||
一些录友当初也是进来 白嫖一波资料,就退款跑了 哈哈哈,不过后面又加回来,例如这位录友:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220516160948.png' width=500 alt=''> </img></div>
|
||||
|
||||
**星球里的资料仅仅是辅助,更重要的是星球里的这一圈人,你会发现 这个圈子的质量非常高!**
|
||||
|
||||
不仅仅是 **211、985录友非常之多**,关键是大家都非常努力上进!
|
||||
|
||||
这是知识星球APP里可以看到,录友们的日常打卡:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220516161612.png' width=500 alt=''> </img></div>
|
||||
|
||||
刷星球上的内容,要刷朋友圈,刷抖音,有意义的多。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220321152039.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20211208223737.png' width=500 alt=''> </img></div>
|
||||
|
||||
星球网页版是这样的:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220517161228.png' width=500 alt=''> </img></div>
|
||||
|
||||
加入星球,是很多录友当年做的最有意义的一件事情
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220103142102.png' width=500 alt=''> </img></div>
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220310154516.png' width=500 alt=''> </img></div>
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20211217103704.png' width=500 alt=''> </img></div>
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20211122223125.png' width=500 alt=''> </img></div>
|
||||
|
||||
可以看看星球里的交流氛围:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20211112170200.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20211112170840.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20211115182306.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220115000350.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220130214431.png' width=500 alt=''> </img></div>
|
||||
|
||||
大家的很多疑问在星球置顶3,我都做了详细的整理,录友都说我是“整理狂魔”,不过大家懒,我就得勤劳一些。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220516162241.png' width=500 alt=''> </img></div>
|
||||
|
||||
星球置顶3的信息量非常大,不仅仅是整理各个求职方向的学习路线,还有大家的常见疑惑,我之前回答过的内容,都做了整理。
|
||||
|
||||
大家看完之后,其实对自己就会有明确的规划了。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220506151741.png' width=500 alt=''> </img></div>
|
||||
|
||||
给大家看看星球置顶帖3的部分内容,以下仅仅是部分截图:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220516215651.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220516215720.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220516215746.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220516215820.png' width=500 alt=''> </img></div>
|
||||
|
||||
|
||||
大家加入星球后,一定要看星球置顶帖和精华帖的内容,你会发现这里很有优秀录友的帖子,包括:各种资料,学习路线,学习心得,规划,职场发展等等。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220517161701.png' width=500 alt=''> </img></div>
|
||||
|
||||
很多录友看完之后都更加明确了自己的方向。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220506151741.png' width=500 alt=''> </img></div>
|
||||
|
||||
|
||||
相对于其他星球,「代码随想录」知识星球到底怎么样,可以看看录友们是怎么说的。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210721143201.png' width=500 alt=''> </img></div>
|
||||
|
||||
最后也欢迎大家加入代码随想录[知识星球](https://mp.weixin.qq.com/s/wPaJumc8afuzWLo72yRlIw),**这里有很多优秀的人,有很多精彩的事!**
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220209171637.png' width=500 alt=''> </img></div>
|
||||
|
||||
这里依然给出10元代金券,微信扫领代金券加入,如果感觉不值得,**三天内知识星球APP右上角直接全额退款!** 无任何套路。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230607171843.png' width=400 alt=''> </img></div>
|
||||
|
||||
|
298
problems/qita/xunlianying.md
Normal file
298
problems/qita/xunlianying.md
Normal file
@ -0,0 +1,298 @@
|
||||
|
||||
# 代码随想录算法训练营
|
||||
|
||||
> 训练营17期将在6月28日开营,目前可以报名,提前拉群,在群里等着开营就好!
|
||||
|
||||
大家可以百度搜索:代码随想录算法训练营, 看看往期录友们在训练营里打卡总结的博客。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221104123405.png' width=500 alt=''> </img></div>
|
||||
|
||||
这是训练营里录友坚持到最后一天的打卡,大家可以看看他们的博客是每天都有记录的:
|
||||
|
||||
* [训练营结束,深感坚持是最难的(Java-犯困-东南研二)](https://blog.csdn.net/weixin_57956443/article/details/128995318)
|
||||
* [训练营一刷总结(Java-HQH-研二)](https://blog.csdn.net/weixin_43821876/article/details/128991822)
|
||||
* [训练营总结,一群人才能走的更远(Java-Lixy-已工作南京)](https://blog.csdn.net/weixin_45368277/article/details/128997823)
|
||||
* [训练营总结,中途🐑了,也坚持下来(C++-Jane-科大研二)](https://blog.csdn.net/Jane_10358/article/details/128977424)
|
||||
* [这两个月有很多不可控因素,但依然坚持下来(java-hha-南工大二)](https://blog.csdn.net/qerwtrt4t/article/details/128975401)
|
||||
* [训练营总结,最后坚持下来(C++ - 阿舟 - 已工作武汉)](https://blog.csdn.net/m0_74360161/article/details/129000723)
|
||||
* [训练营总结,一刷知识点回顾(Java-魏-待就业)](https://blog.csdn.net/weixin_48111139/article/details/128973746)
|
||||
* [在训练营中,零基础刷一遍的感受(C++-东风-东北大学研二)](https://blog.csdn.net/nightcood/article/details/128947111)
|
||||
|
||||
|
||||
博客链接:[https://blog.csdn.net/m0_61724447/article/details/128443084](https://blog.csdn.net/m0_61724447/article/details/128443084)
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230101122746.png' width=500 alt=''> </img></div>
|
||||
|
||||
博客链接:[https://juejin.cn/post/7170304080504586254](https://juejin.cn/post/7170304080504586254)
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230101122837.png' width=500 alt=''> </img></div>
|
||||
|
||||
博客链接:[https://blog.csdn.net/weixin_44047621/article/details/128430623](https://blog.csdn.net/weixin_44047621/article/details/128430623)
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230101122913.png' width=500 alt=''> </img></div>
|
||||
|
||||
博客链接:[https://blog.csdn.net/weixin_47467016/article/details/128460565](https://blog.csdn.net/weixin_47467016/article/details/128460565v)
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230101123012.png' width=500 alt=''> </img></div>
|
||||
|
||||
也有一些录友,把总结发在训练营内部打卡表里,例如:
|
||||
|
||||
昵称:java-低调-已工作
|
||||
|
||||
通过两个月的时间系统性的学习了算法,然后按照不同的题目去做分类,设计的刷题进度也很好,让自己有了一个质的提升,贵在坚持,好在自己也是坚持了下来,**通过自己的坚持,让自己养成了一个刷题的好习惯,这才是最难能可贵的**。
|
||||
|
||||
但是时间跨度有点大,还是要继续坚持之后自己去二刷,这样才能更好的巩固,把算法知识学习的更好。
|
||||
|
||||
---------
|
||||
|
||||
昵称:java-岂几岂几-毕业
|
||||
|
||||
收获真的很大,这是第一次刷算法题,清楚了面试高频题的题型,**巩固了之前摇摇欲坠的自学算法基础**。接下来计划是重刷随想录,并且补充上一亩三分地刷题区置顶贴里列出的题型,在巩固一刷的基础上增加做题量。
|
||||
|
||||
------------
|
||||
|
||||
昵称:python/go-ds-研三
|
||||
|
||||
跟着卡哥的训练营最大的收获就是把代码随想录都通读了一遍,因为进营之前就已经刷过不少力扣题了,但很多都是当时自己捣鼓出来或者看官方题解的。
|
||||
|
||||
而这一次的60天刷题,不管题目做没做过,都看过卡哥的代码随想录了,**这其中的区别也是最大的收获就是知识体系建立起来了**,越往后做题,条理越清晰。
|
||||
|
||||
即使有些题一刷还是做不太出来,但不再像之前自己做那样做题前后都是懵逼状态了,而是有一个清晰明了的判断了。
|
||||
|
||||
但coding能力还是有待改进,接下来要进行二刷,同时也祝卡哥的事业蒸蒸日上,代码随想录越办越好!
|
||||
|
||||
------------
|
||||
|
||||
昵称:Python-ukn-研二
|
||||
|
||||
完美收官,有点小遗憾的是后面dp做得有点赶,没有沉下心来消化,接下来重点把自己不擅长的专题和重点专题二刷甚至三刷。
|
||||
|
||||
**跟着训练营练下来最大的感受是很有信心,有节奏有计划**,每过完一个专题,就多一分成就感,题感也越来越好,期待自己的规律二刷,谢谢一路坚持的小伙伴们!谢谢大佬助手和卡哥!
|
||||
|
||||
|
||||
-----------
|
||||
|
||||
|
||||
### 训练营的目的是什么?
|
||||
|
||||
对于刷题,学算法,[《代码随想录》](https://programmercarl.com/other/publish.html)(programmercarl.com)已经把刷题顺序给大家列好了,大家跟着刷就行。
|
||||
|
||||
但即使这样,其实不少录友还会有很多疑问,不知道怎么用代码随想录,例如:
|
||||
|
||||
* 卡哥,**有没有一起从0开始刷代码随想录的录友,想一起组个队**
|
||||
* 卡哥您好,我是985准研一非科班,自学java, 然后现在在刷代码随想录,**请问需要每个题目的所有解法都掌握吗**?请教下卡哥正确的刷题姿势🙏
|
||||
* **我大概多久才能刷完代码随想录**?
|
||||
* 二叉树,我只掌握 递归够用么?
|
||||
* 很多解法,我是不是只用暴力就可以,**时间比较紧,我还要去掌握优化方法吗**?
|
||||
* 卡哥,**请问跟着代码随想录刷题有答疑的服务吗**? 因为有的题目 自己写的怎么都不对,浪费很多时间,可能过来人指点一下立刻就知道。
|
||||
* 卡哥,我KMP太难了,我跳过可以吗?
|
||||
* 卡哥,我进了刷题群,可是**大家刷题进度不尽相同,所以讨论起来经常不在一个频道上**。
|
||||
* 刚开始还看了一周代码随想录,后来又..摆烂了... **最近又重新再看代码随想录,然后卡住了又摆烂了好几天了**......
|
||||
* 卡哥,**我刷题很容易囫囵吞枣,虽然说代码随想录一刷,但很多内容根本没消化,在进度上欺骗自己**,好像一刷完了,但感觉自己理解的,不到30%。
|
||||
* 卡哥,**感觉之前刷的都忘了,能力没有什么提升,现在还是一道都不会做**。我一刷每道题都得先看看题解然后忘了再去看边看边写。
|
||||
|
||||
**以上这些是不是有戳中某些录友们的痛处**。
|
||||
|
||||
其实对于很多算法基础不太好的录友,即使资料已经很齐全,但还是需要一些规划和答疑。
|
||||
|
||||
而且在时间规划上,因为刚开始刷的录友,不知道 前方题目 是多大难度,所以 一开始计划 一天刷三道,往往因为遇到了一道难题,一天也解决不了,耽误了整体进度,甚至直接开始摆烂,下次再开始刷题可能就很久以后了......
|
||||
|
||||
所以 **代码随想录算法训练营** 帮助大家在规划时间内,有质量的完成代码随想录一刷。
|
||||
|
||||
我亲自给大家规划节奏,大家一起按照我的节奏来,规定时间内,一刷一定能把代码随想录所有内容吃透,然后大家自己去二刷,三刷就好了,师傅领进门修行在个人。
|
||||
|
||||
### 训练营提供一些什么呢?
|
||||
|
||||
1.具体内容
|
||||
|
||||
针对代码随想录上,**195篇算法文章,主要题目150道**,手把手带大家刷完,帮大家做好详细刷题规划,每天布置刷题任务,监督博客记录总结。
|
||||
|
||||
任务布置
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221007104512.png' width=500 alt=''> </img></div>
|
||||
|
||||
每日规划:
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221007104345.png' width=500 alt=''> </img></div>
|
||||
|
||||
训练营周期内,每天应该做哪些题目,同时我根据题目的难度,适当调整每天学习安排,不会是 每天固定3题的这种,而是根据难度而定。
|
||||
|
||||
我会告诉大家,哪些解法是一刷的时候必须掌握的,哪些解法可以二刷再去学习,哪些总结是必看的。
|
||||
|
||||
每日打卡:
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221007104738.png' width=500 alt=''> </img></div>
|
||||
|
||||
关于如果debug自己的代码,训练营会给具体建议:
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221007105631.png' width=500 alt=''> </img></div>
|
||||
|
||||
训练营群中每日讨论的重点内容都会做整理,在分享给大家训练营成员:
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221007110042.png' width=500 alt=''> </img></div>
|
||||
|
||||
**同时每天做针对大家的疑问做详细答疑,保证大家消化当天的学习内容**。
|
||||
|
||||
2.**气氛气氛还是气氛**
|
||||
|
||||
训练营中,**大家都是同一个基础,同一个进度刷题,每天刷题题目都是一样的**,这样的一个学习群,大家讨论起来更有意义。
|
||||
**还有会监督机制**,训练营的成员要注册一个自己的博客(自己搭建或者使用博客网站都可以),每天要去写今日刷题心得和总结,来进行打卡。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221007103231.png' width=500 alt=''> </img></div>
|
||||
|
||||
3.带大家写博客
|
||||
|
||||
很多录友平时刷题,或者学习技术,没有写博客的习惯,或者因为懒,就不写了。
|
||||
|
||||
但大家学了很多技术之后,发现 好像都忘了。。。
|
||||
|
||||
所以训练营会带着大家写博客,每天都要写博客,博客的标题,格式,我都帮大家规划好,倒逼自己养生记录的习惯。
|
||||
|
||||
因为训练营很多录友开始有了写博客的习惯,以下是一些录友博客的结尾部分:
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221008095645.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221008095408.png' width=500 alt=''> </img></div>
|
||||
|
||||
每天训练营群里会每天统计大家的博客情况。这样不仅可以监督自己总结,针对大家写的比较好的博客,会给予曝光,增加自己写博客的动力。
|
||||
|
||||
训练营里的录友们可以相互参考对方的博客,看谁总结的更好。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221007111116.png' width=500 alt=''> </img></div>
|
||||
|
||||
|
||||
4.关于答疑
|
||||
|
||||
很多录友可能担心自己的问题,得不到解决,或者在群里和大家讨论,也没人回复 导致自己因为小问题卡了很久,甚至直接摆烂好一阵子。
|
||||
|
||||
所以训练营里大家的问题,我都会做答疑。
|
||||
|
||||
估计训练营里的问题会比较多,我也可能回答不过来。所以我会找了算法能力很强的助手协助我给大家答疑,也就是说,**大家刷题遇到问题,不会有后顾之忧,当天的问题,当天一定会得到解决**。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20221008103558.png' width=500 alt=''> </img></div>
|
||||
|
||||
当然训练营题目答疑,**仅限于 每天规划的题目**,并不会大家刷的其他算法题都做答疑,那样的话工作量很容易不可控(这里我也不会夸大承诺,欺骗大家报名之类的),如果是其他算法题可以在群里和大家交流。
|
||||
|
||||
### 训练营的资料是什么呢?
|
||||
|
||||
**强调一下:训练营里所有的资料,都是我独立制作而且是开源免费的:即代码随想录网站(programmercarl.com),Github:https://github.com/youngyangyang04/leetcode-master和[代码随想录算法公开课](https://mp.weixin.qq.com/s/xncn6IHJGs45sJOChN6V_g)**
|
||||
|
||||
训练营提供给大家的服务是**规划,监督,指导和答疑**。
|
||||
|
||||
至于代码随想录算法内容的质量如何,这个已经是有口皆碑了,基本是面试求职必刷的资料。
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220815160227.png' width=500 alt=''> </img></div>
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20220815160306.png' width=500 alt=''> </img></div>
|
||||
|
||||
而且代码随想录开源的内容要比市面上 大家付费几百,上千元报的算法训练营的资料都要好的多。
|
||||
|
||||
毕竟内容是开源的,质量如何 大家自己去看就好。
|
||||
|
||||
### 训练营的学习方式
|
||||
|
||||
组织方式:一个学习微信群(180人左右),大家进群之后,等群公告就好,我会通知开始时间和每日刷题计划。
|
||||
|
||||
所需时间:训练营为期60天(两个月),群里每天会布置学习任务,只要大家跟上节奏,60天一定可以刷完代码随想录。
|
||||
|
||||
每日任务:需要花费3-4个小时左右的时间来完成。这是针对一般算法水平的学习速度来规划的时间,不同水平会有差异。
|
||||
|
||||
每周周日会休息一天,没跟上进度的录友,可以跟进度,跟上进度的录友可以复习或者适当放松一下。
|
||||
|
||||
监督机制:训练营里,每天会针对大家每天所刷的题目做答疑,同时也会有监督打卡机制,在群公告里会详细描述。
|
||||
|
||||
所需语言:**所有语种都可以**,毕竟代码随想录几乎支持所有主流语言,**也会针对大家所用的语言做针对性答疑**。
|
||||
|
||||
### 开营时间
|
||||
|
||||
**训练营开始常态化报名,即一直可以报名,当人满180人的时候,就开始新的一期**。 最新的一期可以看文章评论区。
|
||||
|
||||
### 训练营的价格
|
||||
|
||||
大家应该最关心的是价格了,**定价依然是268元**,注意这是两个月训练营的费用,而且是全程规划,指导,监督和答疑。
|
||||
|
||||
(对于[知识星球](https://programmercarl.com/other/kstar.html)里的录友的话,训练营会立减30元,也就是238元,后面如果推出其他服务,星球录友都相当于VIP,都会有优惠。当然如果你已经报了训练营,再去报知识星球,并不给再给大家优惠了,一定要先是星球成员,再报训练营才有优惠)
|
||||
|
||||
大家能在市面上找到算法训练营都价格不菲,基本都是上千的单价,**而且内容和质量并没有 代码随想录 优质**。
|
||||
|
||||
后面一定会涨价的,**如果你确实需要有人带,有监督,给规划,有答疑,能花两个月时间更下来的话,还是早报早学习**。
|
||||
|
||||
### 我适合报名吗?
|
||||
|
||||
符合一下特点的录友可以报名:
|
||||
|
||||
* 基础比较差,没刷过代码随想录或者刚开始刷
|
||||
* 刷过一些代码随想录的题目了,感觉掌握不扎实,想用2个月时间系统重刷一遍
|
||||
* 自己刷题,**很容易遇到各种代码问题,需要有人答疑**
|
||||
* 以前一刷过,但基本都忘了,想高质量二刷
|
||||
* **想找队友,一起从0刷代码随想录**
|
||||
* 自控能力差,遇到点问题就容易躺好一阵子,需要别人监督学习
|
||||
* **想有一个规划时间,来刷完代码随想录**
|
||||
* 不知道代码随想录中哪些解法是必备的,哪些解法是可以简单了解的
|
||||
* 刷题总会忘,感觉刷了和没刷差不多,**不擅长做总结,不擅长写博客记录心得**,自己也懒得写博客写总结
|
||||
|
||||
以下录友不合适报名:
|
||||
|
||||
* 自学能力强,代码随想录资料都是开源的,刷题顺序也列好了,自学能力强的录友自己学就行
|
||||
* 有算法和代码基础,基本算法题遇到的问题,都能通过自己debug解决
|
||||
* 没有两个月时间,每天也不能抽出那么多时间学习算法
|
||||
* 算法0基础,基本的数据结构都没听说过,例如数组,链表。
|
||||
* 编程0基础,基本的编程语言还不会,因为训练营还是默认大家会熟悉所用编程语言里的各种容器的使用
|
||||
|
||||
**训练营不限编程语言**,任何语言都可以报名,都会答疑。
|
||||
|
||||
|
||||
### 常见疑问
|
||||
|
||||
**海外录友有时差可以报名吗**?
|
||||
|
||||
可以的,一期就有很多海外的录友,有疑问在群里也会回复,而且群里讨论的重点内容,都会有总结,不用担心错过了精彩内容。
|
||||
|
||||
**已经工作的录友适合报名吗**?
|
||||
|
||||
适合报名。对于工作的录友,每天未必说一定挤出3-4个小时来刷题。
|
||||
|
||||
对于时间充足的录友,要刷拓展题,要写博客作总结。 如果时间紧张,任务上是可以适当精简。
|
||||
|
||||
所以每日任务弹性还是比较大的,至少跟上进度保证每天的题目代码提交通过了,看看群里的讨论,自己理解加深了就可以。
|
||||
|
||||
工作的录友要学会挤时间,训练营一期录友有不少是工作的,他们是这么搞的:
|
||||
|
||||
训练营每日晚上提前发布明天的任务, 他们第二天通勤 时候 可以先看题想思路,白天抽空看文章解析 看看思路是否一致,看看群里讨论内容,晚上下班可以一口气把当天的题目刷完。
|
||||
|
||||
加入训练营,每日对自己有一个压迫感,挤一挤 时间就有了。
|
||||
|
||||
对于工作的录友,我之前本来计划是安排一期 工作日题量小 休息日题量多一些的训练营,但通过一期发现,包括已经工作的录友,**大家休息日真的没有心思学习,甚至“比工作日更忙”**,所以理想很丰满,现实很骨感。
|
||||
|
||||
**要不要搞三个月四个月半年的训练营**?
|
||||
|
||||
目前来看四个月以上的时间有点太长了,时间长价格也会高,毕竟要服务的时间长了。
|
||||
|
||||
而且刷题在于一鼓作气,把时间拉的太长,很多录友都是前期 动力十足,后面无论是 如何@ 如何公告 如果催大家 赶进度,大家都会无动于衷,从最终效果来看 战线不能太长。
|
||||
|
||||
所以没有逼自己一把 跟上进度的决心,就算搞一年时间的训练营,该放弃的还是会放弃。
|
||||
|
||||
至于三个月的训练营,是可以考虑的,不过安排时间还要待定。
|
||||
|
||||
### 报名方式
|
||||
|
||||
扫码支付268元。 (如果是[代码随想录知识星球](https://programmercarl.com/other/kstar.html)成员录友,只需要支付238元,提交客服的时候需提供知识星球截图,**注意一定要是代码随想录知识星球**)
|
||||
|
||||
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230603175016.png' width=500 alt=''> </img></div>
|
||||
|
||||
付款后,将付款截图发给客服,客服会在24h内统一回复,**所以大家发给客服信息不要急,当天一定会回复的**。
|
||||
|
||||

|
||||
|
||||
客服的联系方式就在大家的微信聊天窗口,不用担心突出聊天窗口错过消息,客服回复之后 会有微信提示的。
|
||||
|
||||
关于训练营的任何问题,可以在客服这里咨询!
|
||||
|
||||
|
||||
### 最后
|
||||
|
||||
训练营其实算是代码随想录的一个补充,其内容都是免费开放的,有学习能力的录友自己学习就好。
|
||||
|
||||
单就从我的 [代码随想录算法公开课](https://mp.weixin.qq.com/s/xncn6IHJGs45sJOChN6V_g) 来说,质量如何,大家可以去看评论区,我完全可以把它做成付费的视频课,但我还是选择免费开放给大家,目前一周会更新四个算法视频,已经快把二叉树系列更完了。
|
||||
|
||||
之所以做训练营,是因为大家太多的问题,不是视频或者文章教程可以解决的,需要的是规划,组织,监督和答疑。
|
||||
|
||||
所以我才组织训练营,搞成付费的也是为了质量更高一些,同时也是因为需要一些门槛,要不然就和普通刷题群没什么区别了。
|
||||
|
||||
等大家跟着代码随想录训练营一路走下来之后,大家再回顾自己两个月学习的内容和总结的博客,**一定会发现 这个价格 物超所值**!
|
||||
|
||||
关于训练营的任何疑问都可以扫码联系客服
|
||||
|
||||

|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
> 号外!!代码随想录图论内容已经计划开更了!
|
||||
|
||||
在[深度优先搜索](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/)的讲解中,我们就讲过深度优先搜索和广度优先搜索的区别。
|
||||
在[深度优先搜索](https://programmercarl.com/图论深搜理论基础.html)的讲解中,我们就讲过深度优先搜索和广度优先搜索的区别。
|
||||
|
||||
广搜(bfs)是一圈一圈的搜索过程,和深搜(dfs)是一条路跑到黑然后在回溯。
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
# 深度优先搜索理论基础
|
||||
|
||||
录友们期待图论内容已久了,为什么鸽了这么久,主要是最近半年开始更新[代码随想录算法公开课](https://mp.weixin.qq.com/s/xncn6IHJGs45sJOChN6V_g),是开源在B站的算法视频,已经帮助非常多基础不好的录友学习算法。
|
||||
录友们期待图论内容已久了,为什么鸽了这么久,主要是最近半年开始更新[代码随想录算法公开课](https://www.bilibili.com/video/BV1fA4y1o715/),是开源在B站的算法视频,已经帮助非常多基础不好的录友学习算法。
|
||||
|
||||
录视频其实是非常累的,也要花很多时间,所以图论这边就没抽出时间来。
|
||||
|
||||
|
Reference in New Issue
Block a user