【递归入门】leetcode11 跳水板

题目详情

【递归入门】leetcode11 跳水板_第1张图片
难度:== 简单 ==
链接:在这里插入图片描述

解析

由于是递归联系,因此仅考虑递归做法:

1、考虑情况

Ⅰ、longer == shorter && k!=0时,只有一种情况,总长度为 l e n g t h = l o n g e r ∗ n + s h o r t e r ∗ ( k − n ) length=longer*n+shorter*(k-n) length=longern+shorter(kn)
Ⅱ、k==0时,一种情况,总长度为空,如果计为0的话会 WA
Ⅲ、一般情况,总长度有多种情况,用vector存储
2、考虑递归函数表达式
主要用于一般情况,特殊情况不在考虑范围内,如果f(x,y)表示x块短板,y块长板的板子长度的组合情况,x+y=k,那么即有: f ( x , y ) = f ( x − 1 , y + 1 ) . . . . . . . . . . . . . . . . . . . . . . . . . f ( 0 , y ) " y = k " f(x, y)=f(x-1,y+1).........................f(0,y)"y=k" f(x,y)=f(x1,y+1).........................f(0,y)"y=k"
3、考虑递归每级需要做什么
由于上面的分级,因此每级递归只需要考虑一种增加的情况,只需将板子长度计算出来push到vector中即可。

AC代码:

class Solution {
public:
    vectorvec;
    vector divingBoard(int shorter, int longer, int k) {
        if(shorter==longer && k!=0){
            vec.push_back(shorter*k);
            return vec;
        }
        else{
            if(k == 0) {
            return vector{};
        }
            help_fx(shorter,longer,k,0);
            sort(vec.begin(),vec.end());
            vec.erase(unique(vec.begin(),vec.end()),vec.end());
            return vec;
        }
    }
    void help_fx(int shorter,int longer,int x,int y){
        if(x<0||y<0) return ;
        int length=shorter*x+longer*y;
        vec.push_back(length);
        help_fx(shorter,longer,x-1,y+1);
    }
};

你可能感兴趣的:(算法)