Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 467e6c7

Browse files
Merge branch 'youngyangyang04:master' into jian
2 parents d5e0827 + e8a10ab commit 467e6c7

8 files changed

+246
-43
lines changed

‎problems/0070.爬楼梯.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ public:
130130
};
131131
```
132132
133-
* 时间复杂度:$O(n)$
134-
* 空间复杂度:$O(n)$
133+
* 时间复杂度:O(n)
134+
* 空间复杂度:O(n)
135135
136136
当然依然也可以,优化一下空间复杂度,代码如下:
137137
@@ -154,8 +154,8 @@ public:
154154
};
155155
```
156156

157-
* 时间复杂度:$O(n)$
158-
* 空间复杂度:$O(1)$
157+
* 时间复杂度:O(n)
158+
* 空间复杂度:O(1)
159159

160160
后面将讲解的很多动规的题目其实都是当前状态依赖前两个,或者前三个状态,都可以做空间上的优化,**但我个人认为面试中能写出版本一就够了哈,清晰明了,如果面试官要求进一步优化空间的话,我们再去优化**
161161

@@ -524,3 +524,4 @@ impl Solution {
524524
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
525525
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
526526
</a>
527+

‎problems/0111.二叉树的最小深度.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。
4141

4242
* 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
43-
* 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)
43+
* 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
4444

4545
那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。
4646

‎problems/0150.逆波兰表达式求值.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,67 @@ impl Solution {
489489
}
490490
```
491491

492+
### C:
493+
494+
```c
495+
int str_to_int(char *str) {
496+
// string转integer
497+
int num = 0, tens = 1;
498+
for (int i = strlen(str) - 1; i >= 0; i--) {
499+
if (str[i] == '-') {
500+
num *= -1;
501+
break;
502+
}
503+
num += (str[i] - '0') * tens;
504+
tens *= 10;
505+
}
506+
return num;
507+
}
508+
509+
int evalRPN(char** tokens, int tokensSize) {
510+
511+
int *stack = (int *)malloc(tokensSize * sizeof(int));
512+
assert(stack);
513+
int stackTop = 0;
514+
515+
for (int i = 0; i < tokensSize; i++) {
516+
char symbol = (tokens[i])[0];
517+
if (symbol < '0' && (tokens[i])[1] == '0円') {
518+
519+
// pop两个数字
520+
int num1 = stack[--stackTop];
521+
int num2 = stack[--stackTop];
522+
523+
// 计算结果
524+
int result;
525+
if (symbol == '+') {
526+
result = num1 + num2;
527+
} else if (symbol == '-') {
528+
result = num2 - num1;
529+
} else if (symbol == '/') {
530+
result = num2 / num1;
531+
} else {
532+
result = num1 * num2;
533+
}
534+
535+
// push回stack
536+
stack[stackTop++] = result;
537+
538+
} else {
539+
540+
// push数字进stack
541+
int num = str_to_int(tokens[i]);
542+
stack[stackTop++] = num;
543+
544+
}
545+
}
546+
547+
int result = stack[0];
548+
free(stack);
549+
return result;
550+
}
551+
```
552+
492553
<p align="center">
493554
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
494555
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>

‎problems/0225.用队列实现栈.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,6 +1277,95 @@ impl MyStack {
12771277
}
12781278
```
12791279

1280+
### C:
1281+
1282+
> C:单队列
1283+
1284+
```c
1285+
typedef struct Node {
1286+
int val;
1287+
struct Node *next;
1288+
} Node_t;
1289+
1290+
// 用单向链表实现queue
1291+
typedef struct {
1292+
Node_t *head;
1293+
Node_t *foot;
1294+
int size;
1295+
} MyStack;
1296+
1297+
MyStack* myStackCreate() {
1298+
MyStack *obj = (MyStack *)malloc(sizeof(MyStack));
1299+
assert(obj);
1300+
obj->head = NULL;
1301+
obj->foot = NULL;
1302+
obj->size = 0;
1303+
return obj;
1304+
}
1305+
1306+
void myStackPush(MyStack* obj, int x) {
1307+
1308+
Node_t *temp = (Node_t *)malloc(sizeof(Node_t));
1309+
assert(temp);
1310+
temp->val = x;
1311+
temp->next = NULL;
1312+
1313+
// 添加至queue末尾
1314+
if (obj->foot) {
1315+
obj->foot->next = temp;
1316+
} else {
1317+
obj->head = temp;
1318+
}
1319+
obj->foot = temp;
1320+
obj->size++;
1321+
}
1322+
1323+
int myStackPop(MyStack* obj) {
1324+
1325+
// 获取末尾元素
1326+
int target = obj->foot->val;
1327+
1328+
if (obj->head == obj->foot) {
1329+
free(obj->foot);
1330+
obj->head = NULL;
1331+
obj->foot = NULL;
1332+
} else {
1333+
1334+
Node_t *prev = obj->head;
1335+
// 移动至queue尾部节点前一个节点
1336+
while (prev->next != obj->foot) {
1337+
prev = prev->next;
1338+
}
1339+
1340+
free(obj->foot);
1341+
obj->foot = prev;
1342+
obj->foot->next = NULL;
1343+
}
1344+
1345+
obj->size--;
1346+
return target;
1347+
}
1348+
1349+
int myStackTop(MyStack* obj) {
1350+
return obj->foot->val;
1351+
}
1352+
1353+
bool myStackEmpty(MyStack* obj) {
1354+
return obj->size == 0;
1355+
}
1356+
1357+
void myStackFree(MyStack* obj) {
1358+
Node_t *curr = obj->head;
1359+
while (curr != NULL) {
1360+
Node_t *temp = curr->next;
1361+
free(curr);
1362+
curr = temp;
1363+
}
1364+
free(obj);
1365+
}
1366+
1367+
```
1368+
12801369
12811370
<p align="center">
12821371
<a href="https://programmercarl.com/other/kstar.html" target="_blank">

‎problems/0239.滑动窗口最大值.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,38 @@ public:
890890
};
891891
```
892892
893+
### C
894+
895+
```c
896+
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {
897+
*returnSize = numsSize - k + 1;
898+
int *res = (int*)malloc((*returnSize) * sizeof(int));
899+
assert(res);
900+
int *deque = (int*)malloc(numsSize * sizeof(int));
901+
assert(deque);
902+
int front = 0, rear = 0, idx = 0;
903+
904+
for (int i = 0 ; i < numsSize ; i++) {
905+
while (front < rear && deque[front] <= i - k) {
906+
front++;
907+
}
908+
909+
while (front < rear && nums[deque[rear - 1]] <= nums[i]) {
910+
rear--;
911+
}
912+
913+
deque[rear++] = i;
914+
915+
if (i >= k - 1) {
916+
res[idx++] = nums[deque[front]];
917+
}
918+
}
919+
920+
return res;
921+
}
922+
923+
```
924+
893925
<p align="center">
894926
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
895927
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>

‎problems/0459.重复的子字符串.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,52 @@ public int[] GetNext(string s)
879879
}
880880
```
881881

882+
### C
883+
884+
```c
885+
// 前缀表不减一
886+
int *build_next(char* s, int len) {
887+
888+
int *next = (int *)malloc(len * sizeof(int));
889+
assert(next);
890+
891+
// 初始化前缀表
892+
next[0] = 0;
893+
894+
// 构建前缀表表
895+
int i = 1, j = 0;
896+
while (i < len) {
897+
if (s[i] == s[j]) {
898+
j++;
899+
next[i] = j;
900+
i++;
901+
} else if (j > 0) {
902+
j = next[j - 1];
903+
} else {
904+
next[i] = 0;
905+
i++;
906+
}
907+
}
908+
return next;
909+
}
910+
911+
bool repeatedSubstringPattern(char* s) {
912+
913+
int len = strlen(s);
914+
int *next = build_next(s, len);
915+
bool result = false;
916+
917+
// 检查最小重复片段能否被长度整除
918+
if (next[len - 1]) {
919+
result = len % (len - next[len - 1]) == 0;
920+
}
921+
922+
free(next);
923+
return result;
924+
}
925+
926+
```
927+
882928
883929
<p align="center">
884930
<a href="https://programmercarl.com/other/kstar.html" target="_blank">

‎problems/0494.目标和.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -670,18 +670,26 @@ class Solution:
670670

671671
# 创建二维动态规划数组,行表示选取的元素数量,列表示累加和
672672
dp = [[0] * (target_sum + 1) for _ in range(len(nums) + 1)]
673+
dp = [[0] * (target_sum + 1) for _ in range(len(nums))]
673674

674675
# 初始化状态
675676
dp[0][0] = 1
677+
if nums[0] <= target_sum:
678+
dp[0][nums[0]] = 1
679+
numZero = 0
680+
for i in range(len(nums)):
681+
if nums[i] == 0:
682+
numZero += 1
683+
dp[i][0] = int(math.pow(2, numZero))
676684

677685
# 动态规划过程
678-
for i in range(1, len(nums)+1):
686+
for i in range(1, len(nums)):
679687
for j in range(target_sum + 1):
680688
dp[i][j] = dp[i - 1][j] # 不选取当前元素
681689
if j >= nums[i - 1]:
682-
dp[i][j] += dp[i - 1][j - nums[i-1]] # 选取当前元素
690+
dp[i][j] += dp[i - 1][j - nums[i]] # 选取当前元素
683691

684-
return dp[len(nums)][target_sum] # 返回达到目标和的方案数
692+
return dp[len(nums)-1][target_sum] # 返回达到目标和的方案数
685693

686694

687695
```

‎problems/0518.零钱兑换II.md

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ object Solution {
546546
}
547547
}
548548
```
549-
## C
549+
### C
550550

551551
```c
552552
int change(int amount, int* coins, int coinsSize) {
@@ -593,37 +593,3 @@ public class Solution
593593
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
594594
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
595595
</a>
596-
597-
----------
598-
599-
600-
601-
回归本题,动规五步曲来分析如下:
602-
603-
1. 确定dp数组以及下标的含义
604-
605-
dp[j]:凑成总金额j的货币组合数为dp[j]
606-
607-
2. 确定递推公式
608-
609-
dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。
610-
611-
所以递推公式:dp[j] += dp[j - coins[i]];
612-
613-
**这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇[494. 目标和](https://programmercarl.com/0494.目标和.html)中就讲解了,求装满背包有几种方法,公式都是:dp[j] += dp[j - nums[i]];**
614-
615-
3. dp数组如何初始化
616-
617-
首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。
618-
619-
那么 dp[0] = 1 有没有含义,其实既可以说 凑成总金额0的货币组合数为1,也可以说 凑成总金额0的货币组合数为0,好像都没有毛病。
620-
621-
但题目描述中,也没明确说 amount = 0 的情况,结果应该是多少。
622-
623-
这里我认为题目描述还是要说明一下,因为后台测试数据是默认,amount = 0 的情况,组合数为1的。
624-
625-
下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]
626-
627-
dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。
628-
629-
----------------

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /