跳水板

  你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为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;
 }

 

posted @ 2020-05-27 21:15  关注我更新论文解读  阅读(137)  评论(0编辑  收藏  举报