LeetCode 面试题16.11.跳水板

题目

你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为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;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容