Skip to content

Commit 418db33

Browse files
Merge pull request youngyangyang04#1014 from KingArthur0205/remote
添加 0509.斐波那契数.md, 0070.爬楼梯.md, 0746.使用最小花费爬楼梯.md, 0062.不同路径.md, 0063.不同路径II.md C语言版本
2 parents 92c507b + d76b736 commit 418db33

5 files changed

+180
-0
lines changed

problems/0062.不同路径.md

+36
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,42 @@ var uniquePaths = function(m, n) {
347347
};
348348
```
349349

350+
### C
351+
```c
352+
//初始化dp数组
353+
int **initDP(int m, int n) {
354+
//动态开辟dp数组
355+
int **dp = (int**)malloc(sizeof(int *) * m);
356+
int i, j;
357+
for(i = 0; i < m; ++i) {
358+
dp[i] = (int *)malloc(sizeof(int) * n);
359+
}
360+
361+
//从0,0到i,0只有一种走法,所以dp[i][0]都是1,同理dp[0][j]也是1
362+
for(i = 0; i < m; ++i)
363+
dp[i][0] = 1;
364+
for(j = 0; j < n; ++j)
365+
dp[0][j] = 1;
366+
return dp;
367+
}
368+
369+
int uniquePaths(int m, int n){
370+
//dp数组,dp[i][j]代表从dp[0][0]到dp[i][j]有几种走法
371+
int **dp = initDP(m, n);
372+
373+
int i, j;
374+
//到达dp[i][j]只能从dp[i-1][j]和dp[i][j-1]出发
375+
//dp[i][j] = dp[i-1][j] + dp[i][j-1]
376+
for(i = 1; i < m; ++i) {
377+
for(j = 1; j < n; ++j) {
378+
dp[i][j] = dp[i-1][j] + dp[i][j-1];
379+
}
380+
}
381+
int result = dp[m-1][n-1];
382+
free(dp);
383+
return result;
384+
}
385+
```
350386
351387
-----------------------
352388
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0063.不同路径II.md

+54
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,60 @@ var uniquePathsWithObstacles = function(obstacleGrid) {
333333
};
334334
```
335335

336+
C
337+
```c
338+
//初始化dp数组
339+
int **initDP(int m, int n, int** obstacleGrid) {
340+
int **dp = (int**)malloc(sizeof(int*) * m);
341+
int i, j;
342+
//初始化每一行数组
343+
for(i = 0; i < m; ++i) {
344+
dp[i] = (int*)malloc(sizeof(int) * n);
345+
}
346+
347+
//先将第一行第一列设为0
348+
for(i = 0; i < m; ++i) {
349+
dp[i][0] = 0;
350+
}
351+
for(j = 0; j < n; ++j) {
352+
dp[0][j] = 0;
353+
}
354+
355+
//若碰到障碍,之后的都走不了。退出循环
356+
for(i = 0; i < m; ++i) {
357+
if(obstacleGrid[i][0]) {
358+
break;
359+
}
360+
dp[i][0] = 1;
361+
}
362+
for(j = 0; j < n; ++j) {
363+
if(obstacleGrid[0][j])
364+
break;
365+
dp[0][j] = 1;
366+
}
367+
return dp;
368+
}
369+
370+
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
371+
int m = obstacleGridSize, n = *obstacleGridColSize;
372+
//初始化dp数组
373+
int **dp = initDP(m, n, obstacleGrid);
374+
375+
int i, j;
376+
for(i = 1; i < m; ++i) {
377+
for(j = 1; j < n; ++j) {
378+
//若当前i,j位置有障碍
379+
if(obstacleGrid[i][j])
380+
//路线不同
381+
dp[i][j] = 0;
382+
else
383+
dp[i][j] = dp[i-1][j] + dp[i][j-1];
384+
}
385+
}
386+
//返回最后终点的路径个数
387+
return dp[m-1][n-1];
388+
}
389+
```
336390
337391
-----------------------
338392
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0070.爬楼梯.md

+42
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,48 @@ var climbStairs = function(n) {
296296
};
297297
```
298298

299+
### C
300+
```c
301+
int climbStairs(int n){
302+
//若n<=2,返回n
303+
if(n <= 2)
304+
return n;
305+
//初始化dp数组,数组大小为n+1
306+
int *dp = (int *)malloc(sizeof(int) * (n + 1));
307+
dp[0] = 0, dp[1] = 1, dp[2] = 2;
308+
309+
//从前向后遍历数组,dp[i] = dp[i-1] + dp[i-2]
310+
int i;
311+
for(i = 3; i <= n; ++i) {
312+
dp[i] = dp[i - 1] + dp[i - 2];
313+
}
314+
//返回dp[n]
315+
return dp[n];
316+
}
317+
```
318+
319+
优化空间复杂度:
320+
```c
321+
int climbStairs(int n){
322+
//若n<=2,返回n
323+
if(n <= 2)
324+
return n;
325+
//初始化dp数组,数组大小为3
326+
int *dp = (int *)malloc(sizeof(int) * 3);
327+
dp[1] = 1, dp[2] = 2;
328+
329+
//只记录前面两个台阶的状态
330+
int i;
331+
for(i = 3; i <= n; ++i) {
332+
int sum = dp[1] + dp[2];
333+
dp[1] = dp[2];
334+
dp[2] = sum;
335+
}
336+
//返回dp[2]
337+
return dp[2];
338+
}
339+
```
340+
299341

300342
-----------------------
301343
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0509.斐波那契数.md

+32
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,38 @@ var fib = function(n) {
245245
};
246246
```
247247

248+
### C
249+
动态规划:
250+
```c
251+
int fib(int n){
252+
//当n <= 1时,返回n
253+
if(n <= 1)
254+
return n;
255+
//动态开辟一个int数组,大小为n+1
256+
int *dp = (int *)malloc(sizeof(int) * (n + 1));
257+
//设置0号位为0,1号为为1
258+
dp[0] = 0;
259+
dp[1] = 1;
260+
261+
//从前向后遍历数组(i=2; i <= n; ++i),下标为n时的元素为dp[i-1] + dp[i-2]
262+
int i;
263+
for(i = 2; i <= n; ++i) {
264+
dp[i] = dp[i - 1] + dp[i - 2];
265+
}
266+
return dp[n];
267+
}
268+
```
269+
270+
递归实现:
271+
```c
272+
int fib(int n){
273+
//若n小于等于1,返回n
274+
if(n <= 1)
275+
return n;
276+
//否则返回fib(n-1) + fib(n-2)
277+
return fib(n-1) + fib(n-2);
278+
}
279+
```
248280

249281

250282
-----------------------

problems/0746.使用最小花费爬楼梯.md

+16
Original file line numberDiff line numberDiff line change
@@ -266,5 +266,21 @@ var minCostClimbingStairs = function(cost) {
266266
};
267267
```
268268

269+
### C
270+
```c
271+
int minCostClimbingStairs(int* cost, int costSize){
272+
//开辟dp数组,大小为costSize
273+
int *dp = (int *)malloc(sizeof(int) * costSize);
274+
//初始化dp[0] = cost[0], dp[1] = cost[1]
275+
dp[0] = cost[0], dp[1] = cost[1];
276+
277+
int i;
278+
for(i = 2; i < costSize; ++i) {
279+
dp[i] = (dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2]) + cost[i];
280+
}
281+
//选出倒数2层楼梯中较小的
282+
return dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2];
283+
}
284+
```
269285
-----------------------
270286
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

0 commit comments

Comments
 (0)