跳水板
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。
你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。
示例:
输入:
shorter = 1
longer = 2
k = 3
输出: {3,4,5,6}
提示:
0 < shorter <= longer
0 <= k <= 100000
方法一:使用 STL 里面的set ,本题由于通过两个数在原始数据上可能会大量产生重复的数字,所以,为了避免此问题的出现,我们采用set.
#include<iostream>
#include<set>
#include<iterator>
using namespace std;
set<int> st,st1;
set<int>::iterator it;
int main(){
int shorter,longer,k;
cin>>shorter>>longer>>k;
st.insert(0);
for (int i = 0; i < k; i++)
{
st1=st;
for (it = st.begin() ; it!=st.end(); it++)
{
st1.insert(*it+shorter);
st1.insert(*it+longer);
}
st1.erase(st1.begin());
st=st1;
}
for (it = st.begin() ; it!=st.end(); it++)
{
cout<<*it<<" ";
}
// cout<<st.size()<<endl;
}
方法2:递归
k = 0 时竟然要返回空的 vector。长度为0的板不要面子的吗?
当两种板子长度相同的时候,显然无论如何组合,跳板的长度均为 k*shorter。故只有一种长度。
当两种板子的长度不相同的时候,可以组合出 k+1 种长度的跳板,证码过程如下:
首先,我们选择k块短板,此时长度为 k*shorter。这是一种方案。
每用一块长板替换掉一块短板,跳板的长度就会增加 longer - shorter。故每替换一次,就会产生一种新方案。
一共可以替换k次。故总共有 k + 1 种方案。
频繁的push_back 有可能触发内存的频繁分配,如果预先知道push_back的次数,可以预先分配以提高效率。
vector<int> divingBoard(int shorter, int longer, int k) {
if(k == 0) {
return vector<int>{};
}
if(shorter == longer) {
return vector<int> {shorter * k};
}
vector<int> vec(k+1);
for(int i = 0; i <= k; i++) {
vec[i] = (k-i)*shorter + i*longer;
}
return vec;
}
因上求缘,果上努力~~~~ 作者:图神经网络,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/12976650.html