题目详情
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例:
输入:
shorter = 1
longer = 2
k = 3
输出: {3,4,5,6}
提示:
- 0 < shorter <= longer
- 0 <= k <= 100000
——题目难度:简单
分析
先看特殊情况:
① 当 k = 0的时候,因为不可能正好使用 0 块木板来生成跳水板,所以返回空数组
② 当shorter = longer的时候,则建造的跳水板的长度是唯一的,都等于 shorter*k,因此返回长度为 1 的数组,数组中的元素为 shorter*k
剩下的就是 k !=0 和 shorter != longer 的情况了,下面一张图可以说明:
一开始全部是短板,然后短板可以被替换成长板,所以共有情况:1 + k 种。
且首项 a0 为 k * shorter,公差 d 为 longer - shorter,所以通项公式为 an = a0 + (n - 1) * d。
-下面代码
class Solution {
public:
vector<int> divingBoard(int shorter, int longer, int k) {
if (k == 0) return vector<int> ();
if (shorter == longer) return vector<int> (1, shorter * k);
vector<int> ans(k+1);
int a0 = k * shorter, d = longer - shorter; //a0为首项,d为公差
for(int i = 0; i < k + 1; i++)
{
ans[i] = a0 + i * d;
}
return ans;
}
};
结果