给定一个字符数组和一个n,让你计算最少需要多少空间,使得相同元素间隔至少为n???
本题是上一篇力扣最热100题之相同元素间隔放置的进阶版,个人建议把上一篇看完理解在研究本篇内容。
解析: 我们可以考虑,先统计每个字符的个数,然后将其转化为set Map.Entry<>形式,在转换为list,使用Array.sort() 方法来排序。然后选择最多的元素,当作形似矩阵的行数,要间隔的距离加1就是列数,先将每个字符按列摆放到倒数第二行,当把每一个列都填充一个元素后,我们会遇到几种情况:
1、在没有填充玩所有行或者恰好填充玩所有行时,没有剩余任务,就结束 那么所需的时间就为 (最多元素的个数-1) * (n+1) + 最后一行的个数,最后一行的个数就是字符元素数量为最多的元素个数。
2、如果在填完上面部分,但是还有没填进去的,那就只能扩充列,因为题目要求最少间隔n,你也可以多,所以扩充列完全可行。那么很明显,我们此时按照上面计算方式算出来已经少于需要的了,所以上面公式不合适,但是此时我们可以发现,我们需要的时间方框正好就是字符个数。因为字符里面已经没有等待时间了,就相当于每一个时刻都会有一个任务在执行,那么你执行完n个任务,肯定需要n个时间
class Solution2 {
public int leastInterval(char[] tasks, int n) {
if(tasks.length == 0){
return 0;
}
Map<Character, Integer> map = new HashMap<>();
for(int i= 0; i < tasks.length; i++){
char a = tasks[i];
if(!map.containsKey(a)){
map.put(a, 1);
}else{
map.put(a, map.get(a)+1);
}
}
char[] result = new char[tasks.length];
int index = 0;
Set<Map.Entry<Character, Integer>> set = map.entrySet();
List<Map.Entry<Character, Integer>> list = new ArrayList<>(set);
list.sort((o1, o2) -> o2.getValue() - o1.getValue());
int m = list.get(0).getValue();
int lastmax = 1;
for(int i = 1; i < list.size(); i++){
if(list.get(i).getValue() == m){
lastmax += 1;
}
}
return Math.max((m-1) * (n + 1) + lastmax, tasks.length);
// return re.length();
}
}
总结:这个思路整体上已经从最简单的地方编码入手,把每一类情况都分析了,如果有看不明白或者疑问,可以评论区讨论。