leetcode 组合总和

递归-go:

不能想PHP一样使用全局变量

import (
    "fmt"
    "sort"
)

func combinationSum(candidates []int, target int) [][]int {
    var data []int
    var list [][]int

    sort.Ints(candidates[:])

    _,list = getOne(candidates, target, data, list)

    // for i, candidate := range candidates {
    //
    //     if candidate < target {
    //         data = append(data, candidate)
    //         newTarget := target - candidate
    //         combinationSum(candidates[i:], newTarget)
    //         data = append(data[:len(data)-1])
    //     } else if candidate == target {
    //
    //         d := make([]int, len(data))
    //         copy(d, data)
    //         d = append(d, candidate)
    //
    //         list = append(list, d)
    //
    //     } else {
    //         break
    //     }
    // }
    return list
}

func getOne(candidates []int, target int, data []int, list [][]int) ([]int, [][]int) {

    for i, candidate := range candidates {

        if candidate < target {
            data = append(data, candidate)
            newTarget := target - candidate
            data, list = getOne(candidates[i:], newTarget, data, list)
            data = append(data[:len(data)-1])
        } else if candidate == target {

            d := make([]int, len(data))
            copy(d, data)
            d = append(d, candidate)

            list = append(list, d)

        } else {
            break
        }
    }

    return data, list
}

递归-php:

function combinationSum ($candidates, $target)
    {
        sort($candidates);
        foreach ($candidates as $i => $candidate) {

            // 值小于目标,则递归
            if ($candidate < $target) {
                
                $this->data[] = $candidate;

                $newTarget = $target - $candidate;
                
                // 每次传入子数组
                $this->combinationSum(array_slice($candidates, $i), $newTarget);
                // 递归完成后回到递归前的$data
                array_pop($this->data);

            } elseif ($candidate == $target) {
                
                $this->data[] = $candidate;
               
                $this->list[] = $this->data;
                
                array_pop($this->data);
                
            } else {
                break;
            }
        }
        return $this->list;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值