@@ -417,39 +417,82 @@ func dfs(k, n int, start int, sum int) {
417
417
```
418
418
419
419
### JavaScript
420
+ - 未剪枝:
420
421
421
422
``` js
422
423
/**
423
424
* @param {number} k
424
425
* @param {number} n
425
426
* @return {number[][]}
426
427
*/
427
- var combinationSum3 = function (k , n ) {
428
- let res = [];
429
- let path = [];
430
- let sum = 0 ;
431
- const dfs = (path ,index ) => {
432
- // 剪枝操作
433
- if (sum > n){
434
- return
435
- }
436
- if (path .length == k) {
437
- if (sum == n){
438
- res .push ([... path]);
439
- return
440
- }
441
- }
442
- for (let i = index; i <= 9 - (k- path .length ) + 1 ;i++ ) {
443
- path .push (i);
444
- sum = sum + i;
445
- index += 1 ;
446
- dfs (path,index);
447
- sum -= i
448
- path .pop ()
449
- }
428
+ var combinationSum3 = function (k , n ) {
429
+ // 回溯法
430
+ let result = [],
431
+ path = [];
432
+ const backtracking = (_k , targetSum , sum , startIndex ) => {
433
+ // 终止条件
434
+ if (path .length === _k) {
435
+ if (sum === targetSum) {
436
+ result .push (path .slice ());
437
+ }
438
+ // 如果总和不相等,就直接返回
439
+ return ;
450
440
}
451
- dfs (path,1 );
452
- return res
441
+
442
+ // 循环当前节点,因为只使用数字1到9,所以最大是9
443
+ for (let i = startIndex; i <= 9 ; i++ ) {
444
+ path .push (i);
445
+ sum += i;
446
+ // 回调函数
447
+ backtracking (_k, targetSum, sum, i + 1 );
448
+ // 回溯
449
+ sum -= i;
450
+ path .pop ();
451
+ }
452
+ };
453
+ backtracking (k, n, 0 , 1 );
454
+ return result;
455
+ };
456
+ ```
457
+
458
+ - 剪枝:
459
+
460
+ ``` js
461
+ /**
462
+ * @param {number} k
463
+ * @param {number} n
464
+ * @return {number[][]}
465
+ */
466
+ var combinationSum3 = function (k , n ) {
467
+ // 回溯法
468
+ let result = [],
469
+ path = [];
470
+ const backtracking = (_k , targetSum , sum , startIndex ) => {
471
+ if (sum > targetSum) {
472
+ return ;
473
+ }
474
+ // 终止条件
475
+ if (path .length === _k) {
476
+ if (sum === targetSum) {
477
+ result .push (path .slice ());
478
+ }
479
+ // 如果总和不相等,就直接返回
480
+ return ;
481
+ }
482
+
483
+ // 循环当前节点,因为只使用数字1到9,所以最大是9
484
+ for (let i = startIndex; i <= 9 - (_k - path .length ) + 1 ; i++ ) {
485
+ path .push (i);
486
+ sum += i;
487
+ // 回调函数
488
+ backtracking (_k, targetSum, sum, i + 1 );
489
+ // 回溯
490
+ sum -= i;
491
+ path .pop ();
492
+ }
493
+ };
494
+ backtracking (k, n, 0 , 1 );
495
+ return result;
453
496
};
454
497
```
455
498
0 commit comments