面试题 16.11. 跳水板
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例:
输入:
shorter = 1
longer = 2
k = 3
输出: {3,4,5,6}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diving-board-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
两种长度的木板,k个,所有长度的可能中,短木板个数i从0到k,长木板从k到0,一共k+1中可能。
因为结果需要排序,只需把第一种可能(全为短木板)放在数组最前,而后依次把短木板换一个换成长木板即可(后一个的总长度是前一个总长度加上长短木板长度的差值)
- 需要注意,
- 题中所给条件,K有可能等于0,在这种情况,巧妇难为无米之炊,返回一个空数组
- 长短木板长度有可能相等,此时把长木板换成短木板并没有变化,总长度只有一个可能
class Solution {
public int[] divingBoard(int shorter, int longer, int k) {
if(k==0){
return new int[0];
}else if(shorter==longer){
return new int[]{
shorter*k};
}
int[] ans=new int[k+1];
int step=longer-shorter;
ans[0]=shorter*k;
for(int i=1;i<ans.length;i++){
ans[i]=ans[i-1]+step;
}
return ans;
}
}
85. 最大矩形
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
[“1”,“0”,“1”,“0”,“0”],
[“1”,“0”,“1”,“1”,“1”],
[“1”,“1”,“1”,“1”,“1”],
[“1”,“0”,“0”,“1”,“0”]
]
输出: 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximal-rectangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
首先,这里说的“矩形” 严格意义上来说,可以说是点阵
在我眼里,把矩形看成一个一个的横线方便解题:
我们有如下的一个矩阵:
- 我们先做一个统计:每个点开始往右,有多少个连续的“1”
- 也就是计算,对每个点来说,它向右的“线”的“长度”
得到这个矩阵:
如上所说,这个矩阵描述了每一个点向右线段的长度,
那么,对于一列来说,比如说第一列(1,1,5,1),表达了这样的信息:
我们显然可以得到左边为这一列的所有可能矩形中,最大的一个
最简单粗暴的方式:两层循环遍历所有可能的上边的所在行和下边的所在行
对于一个特定的上边和下边,我们对应最大的面积就是,上边到下边的距离最短边
比如:对于第三行一行,最大面积应该是15;
但是, 对于第二行