题目
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例
输入:
shorter = 1
longer = 2
k = 3
输出: {3,4,5,6}
题目分析
这道题目不难,主要想记录自己优化的过程。
首先是计算每一个结果的过程,最初的想法是使用两个标识分别标记短木板和长木板的个数,每次将s-- * shorter + l++ * longer
插入数组中。
为了去重,我先将结果存在了一个set
里,然后将set
中的元素插入数组中。
上述的算法可以完成,但是速度很慢,所以我做了以下两个改进:
- 不使用乘法,而是加减法,其实每次长度的变更就是
longer - shorter
; - 其实只有一种情况会出现重复答案,需要去重,那就是
longer == shorter
时,所以只需要做一个判断,如果两个值不等,直接存在数组里;两个值相等,直接返回k * shorts
。
题目解答
class Solution {
public:
vector<int> res;
vector<int> divingBoard(int shorter, int longer, int k) {
if (k < 1) return res;
if (shorter == longer) {
res.push_back(k * shorter);
return res;
}
int temp = shorter * k;
res.push_back(temp);
for (int i = 1; i <= k; i++){
temp += longer - shorter;
res.push_back(temp);
}
return res;
}
};