网页布局中有一种瀑布流布局方式,表现为参差不齐的多栏布局。随着页面滚动条向下,还会不断加载数据块并附加至当前尾部。页面在加载时遵循以下规则:
- 当有数据块需要加载时,优先加载在高度最短的那一列;
- 若存在多个高度相同且最短的情况,则加载在其中最靠左的那一列
已知当前网页共分割为
num
列,该网页有若干数据块可以加载,block[i]
表示第i
个数据块的高度。当页面按顺序加载完所有的数据块后,请返回高度最大的那一列的高度。
不难得出在block数组中始终只保留num个数,而从num之后的数每次加在前num个数中最小的一个。(如果是都一样大小,则加在最左边,但是这条消息在代码中只要从左向右遍历即可)
保留num个数,并且找到最小的数之后要从该数的基础上加上新的数,并且还在该索引中。所以既需要索引也需要值,所以在此题中我采用了HashMap
class Solution {
public int getLengthOfWaterfallFlow(int num, int[] block) {
int max= Integer.MIN_VALUE;
if(block.length<num){
for(int i=0;i<block.length;i++){
max=max>block[i]?max:block[i];
}
}else {HashMap<Integer,Integer> hashmap=new HashMap<>();
for(int i=0;i<num;i++){
hashmap.put(i,block[i]);
}
for(int i=num;i< block.length;i++){
int min=hash_min(hashmap);
int key=find_key(hashmap,min);
min+=block[i];
hashmap.put(key,min);
}
for(Integer value:hashmap.values()){
max=max>value?max:value;
}
}
return max;
}
public int hash_min(HashMap<Integer,Integer> hashMap){
int min=Integer.MAX_VALUE;
for(Integer value:hashMap.values()){
min=min<value?min:value;
}
return min;
}
public int find_key(HashMap<Integer,Integer> hashMap,int value){
int ans=-1;
for(Map.Entry<Integer,Integer> entry:hashMap.entrySet()){
if(value== entry.getValue()){
ans= entry.getKey();
break;
}
}
return ans;
}
}
第一次提交中我并没有采取到if-else,当时并没有考虑如果num比block数组长度大如何处理,当考虑进去即比较block数组中取最大值