echo

任生命穿梭 时间的角落

0%

跳水板

面试题 16.11. 跳水板

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

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

示例:

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

提示:

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

提示中给出了相关信息,我们考虑特殊情况:

  1. k == 0,直接返回一个空数组;
  2. shorter == longer,直接返回 shorter * k,只存在这一个长度。

剩下的一般情况 shorter < longer 且 k != 0,我们直接可以使用一次循环即可,数组第一个元素为 shorter * k,第二个元素为 shorter * (k - 1) + longer,第三个元素为 shorter * (k - 2) + longer * 2 … 最后一个元素为 longer * k,一共 k + 1 个元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int[] divingBoard(int shorter, int longer, int k) {
if(k == 0){
return new int[]{};
}
if(shorter == longer){
return new int[]{shorter * k};
}
int[] ans = new int[k + 1];
for(int i = 0; i <= k; i++){
ans[i] = shorter * (k - i) + longer * i;
}
return ans;
}
}

时间复杂度O(n),空间复杂度O(1)。