File tree 5 files changed +180
-0
lines changed
5 files changed +180
-0
lines changed Original file line number Diff line number Diff line change @@ -347,6 +347,42 @@ var uniquePaths = function(m, n) {
347
347
};
348
348
```
349
349
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
+ ```
350
386
351
387
-----------------------
352
388
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
Original file line number Diff line number Diff line change @@ -333,6 +333,60 @@ var uniquePathsWithObstacles = function(obstacleGrid) {
333
333
};
334
334
```
335
335
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
+ ```
336
390
337
391
-----------------------
338
392
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
Original file line number Diff line number Diff line change @@ -296,6 +296,48 @@ var climbStairs = function(n) {
296
296
};
297
297
```
298
298
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
+
299
341
300
342
-----------------------
301
343
<div align =" center " ><img src =https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width =500 > </img ></div >
Original file line number Diff line number Diff line change @@ -245,6 +245,38 @@ var fib = function(n) {
245
245
};
246
246
```
247
247
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
+ ```
248
280
249
281
250
282
-----------------------
Original file line number Diff line number Diff line change @@ -266,5 +266,21 @@ var minCostClimbingStairs = function(cost) {
266
266
};
267
267
```
268
268
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
+ ```
269
285
-----------------------
270
286
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
You can’t perform that action at this time.
0 commit comments