Leetcode——根据身高重建队列 / 游戏中弱角色的数量 (排序,compare)
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——根据身高重建队列 / 游戏中弱角色的数量 (排序,compare)相关的知识,希望对你有一定的参考价值。
1. 根据身高重建队列
(1)先排序再插队
套路:
- 一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。
在本题:
- 首先对数对进行排序,按照数对的元素 1 降序排序,按照数对的元素 2 升序排序。
- 原因是,按照元素 1 进行降序排序,对于每个元素,在其之前的元素的个数,就是大于等于他的元素的数量,而按照第二个元素正向排序,我们希望 k 大的尽量在后面,减少插入操作的次数。
class Solution {
public int[][] reconstructQueue(int[][] people) {
//按数组第一个元素进行降序,按第二个元素进行升序
Arrays.sort(people, new Comparator<int[]>() {
@Override
public int compare(int[] person1, int[] person2){
if (person1[0] != person2[0]){
//第一个元素不相等时,第一个元素降序
return person2[0] - person1[0];
}else{
//第一个元素相等时,第二个元素升序
return person1[1] - person2[1];
}
}
});
//新建一个list,用于保存结果集
List<int[]> list = new LinkedList<>();
for (int i = 0; i < people.length; i++) {
if (list.size() > people[i][1]){
//结果集中元素个数大于第i个人前面应有的人数时,将第i个人插入到结果集的 people[i][1]位置
list.add(people[i][1],people[i]);
} else {
//结果集中元素个数小于等于第i个人前面应有的人数时,将第i个人追加到结果集的后面
list.add(list.size(),people[i]);
}
}
//将list转化为数组,然后返回
return list.toArray(new int[list.size()][]);
}
}
2. 游戏中弱角色的数量
(1)排序
class Solution {
public int numberOfWeakCharacters(int[][] properties) {
int res = 0;
//第一个元素降序, 第二个元素升序
Arrays.sort(properties, (a, b) -> (a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]));
int maxDef = properties[0][1];
int maxA = properties[0][0];
for (int i = 1; i < properties.length; i++) {
maxDef = Math.max(maxDef, properties[i][1]);
if (properties[i][0] == maxA) {
continue;
}
if (properties[i][1] < maxDef) {
res++;
}
}
return res;
}
}
以上是关于Leetcode——根据身高重建队列 / 游戏中弱角色的数量 (排序,compare)的主要内容,如果未能解决你的问题,请参考以下文章