代码随想录第二十五天|216.组合总和III、17.电话号码的字母组合

216.组合总和III

函数参数:

全局变量:一维数组path,二维数组result, int sum

参数:k,n,starti

终止条件:

if(path.size()==k)

        {

            if(sum==n)

                result.push_back(path);

            return;

        }

单层逻辑:sum和path进行回溯

for(int i=starti;i<=9;i++)

        {

            sum+=i;

            path.push_back(i);

            backtracking(k,n,i+1);

            path.pop_back();

            sum-=i;

        }

对9进行剪枝,如果n小于9则没必要取到数值9,因此min(9,n)

看视频:

剪枝:

1. 如果sum已经大于targetsum(n)就可以返回了

2. 最多需要元素为9-(k-path.size())+1


17.电话号码的字母组合

思路:

先排除digit为空的情况,再将string转化成数组(反转),然后再进行回溯。

int numbers=stoi(digits);

函数参数:

全局变量:vector<string> result; string path; vector<int>nums;

终止条件:

if(path.size()==nums.size())

        {

            result.push_back(path);

            return;

        }

单层逻辑:

注意7和9有四个元素,7以后元素要加1,每次新的数组元素没有要剔除的前值,因此是backTracking(nums,i+1,beginj);

for(int i=begini;i<nums.size();i++)

        {

            //初始化endj

            int endj=3;

            if(nums[i]==7 || nums[i]==9)

                endj=4;


            for(int j=beginj;j<endj;j++)

            {

                //分类讨论

                if(nums[i]>7)

                    path+='a'+3*(nums[i]-2)+j+1;

                else

                    path+='a'+3*(nums[i]-2)+j;

                //下一个数组元素,j没有要剔除的元素

                backTracking(nums,i+1,beginj);

                path.pop_back();

            }

        }

但不知道如何剪枝。

看视频后:

1. 字符串转化:nums.push_back(digits[i]-'0');

2. 数字和字母如何映射:可以使用map或者定义一个二维数组

没有剪枝。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容