• 【LeetCode-数组】跳水板


    题目描述

    你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。

    返回的长度需要从小到大排列。
    示例:

    输入:
    shorter = 1
    longer = 2
    k = 3
    输出: {3,4,5,6}
    

    说明:

    • 0 < shorter <= longer
    • 0 <= k <= 100000

    题目链接: https://leetcode-cn.com/problems/diving-board-lcci/

    思路1

    长度 len = i*shorter + (k-i)*longer,i 在 [0, k] 之间。循环 i 求 len,使用集合 set 记录 len 是否出现过,这一步的目的是去重,然后对答案排序。代码如下:

    class Solution {
    public:
        vector<int> divingBoard(int shorter, int longer, int k) {
            if(k==0) return {};
    
            set<int> s;
            vector<int> ans;
            for(int i=0; i<=k; i++){
                int len = i*shorter + (k-i)*longer;
                if(s.count(len)==0){
                    ans.push_back(len);
                    s.insert(len);
                }
            }
            sort(ans.begin(), ans.end());
            return ans;
        }
    };
    
    • 时间复杂度:O(k)
    • 空间复杂度:O(k)

    思路2

    首先,有两种特殊情况:

    • k = 0,返回空数组;
    • shorter==longer,返回 {shorter*k};

    否则,假设使用了 i 个 longer, k-i 个 shorter,则长度 len = f(i) = i*longer + (k-i)*shorter = k*shorter + (longer-shorter)*i,因为 longer!=shorter,所以随着 i 的增加 f(i) 也是增加的,因为 i ∈ [0, k] 共 k+1 个值,所以最终的答案也有 k+1 个值。代码如下:

    class Solution {
    public:
        vector<int> divingBoard(int shorter, int longer, int k) {
            if(k==0) return {};
            if(shorter==longer) return {shorter*k};
    
            vector<int> ans(k+1, 0);
            for(int i=0; i<=k; i++){
                ans[i] = (k-i)*shorter + i*longer; 
            }
            return ans;
        }
    };
    

    注意要写成ans[i] = (k-i)*shorter + i*longer; ,这样才能保证 ans 是升序的。如果写成i*shorter + (k-i)*longer,这样 ans 是降序的。

    • 时间复杂度:O(n)
    • 空间复杂度:O(1)

    参考

    思路 2 参考了:https://leetcode-cn.com/problems/diving-board-lcci/solution/qing-xi-yi-dong-de-shu-xue-tui-dao-che-di-nong-don/

  • 相关阅读:
    vi 整行 多行 复制与粘贴
    FPGA设计—UVM验证篇 Hello world
    武汉市最大的二手车市场
    vim 使用技巧
    CentOS 7下的软件安装方法及策略
    搜索插件:ack.vim
    Vim插件管理
    【一】 sched.h
    Android USB驱动源码分析(-)
    在Python中反向遍历序列(列表、字符串、元组等)的五种方式
  • 原文地址:https://www.cnblogs.com/flix/p/13269884.html
Copyright © 2020-2023  润新知