春招打卡d14n23-leetcode刷题面试题16.11. 跳水板

151 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode刷题面试题16.11. 跳水板

前文

本题为leetcode数组处理类型题目,题目序号为面试题16.11,主要考察数组处理效率问题,题目链接为 https://leetcode-cn.com/problems/diving-board-lcci/

题目信息

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

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

解题思路

本题目很明显是一个数据处理效率的问题。有长短两种不同的跳水板,计算在共有k根的情况下,能组成多少种长度。用一种最容易想到的思路来解释此题,也就是短板共有0-k种情况,长板对应这些种情况,组成了若干种长度。如果长短版长度不等,则只有一种结果。反之共有k+1种结果。只需要将短板数目从小到大递增,即可实现题目的结果排序要求。至此,改题目解答完毕。代码中利用map的判断存在的地方,可以用长短板是否相等进行优化,进一步提升效率。

解题代码

public int[] divingBoard(int shorter, int longer, int k) {
    Map<Integer,Integer> map = new HashMap<>();
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i < k + 1; i++) {
        int item = longer * i + shorter * (k - i);
        if(!map.containsKey(item) && item > 0){
            list.add(item);
            map.put(item,1);
        }
    }
    int[] result = new int[list.size()];
    for (int i = 0; i < list.size(); i++) {
        result[i] = list.get(i);
    }
    return result;
}

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。