1.题目描述
给你一个字符串数组
nums
和一个整数k
。nums
中的每个字符串都表示一个不含前导零的整数。返回
nums
中表示第k
大整数的字符串。注意:重复的数字在统计时会视为不同元素考虑。例如,如果
nums
是["1","2","2"]
,那么"2"
是最大的整数,"2"
是第二大的整数,"1"
是第三大的整数。示例 1:
输入:nums = ["3","6","7","10"], k = 4 输出:"3" 解释: nums 中的数字按非递减顺序排列为 ["3","6","7","10"] 其中第 4 大整数是 "3"示例 2:
输入:nums = ["2","21","12","1"], k = 3 输出:"2" 解释: nums 中的数字按非递减顺序排列为 ["1","2","12","21"] 其中第 3 大整数是 "2"示例 3:
输入:nums = ["0","0"], k = 2 输出:"0" 解释: nums 中的数字按非递减顺序排列为 ["0","0"] 其中第 2 大整数是 "0"提示:
1 <= k <= nums.length <= 104
1 <= nums[i].length <= 100
nums[i]
仅由数字组成nums[i]
不含任何前导零
2.解题思路
建立大根堆,依次将数组中元素加入到优先队列中,然后依次弹出前k-1个元素,此时的堆顶元素即为第k大元素
自定义排序规则,如果对于comparator(String a, String b)两个参数,要建立大根堆,a > b 返回-1, a < b 返回1,a== b返回0;对于String表示整数的对比,应该先比较长度,长度大的字符串对应的整数大(不包含前导零)。所以有:
a.length() > b.length() 时,返回-1;
a.length() < b.length() 时,返回1;
其余为a,b长度相同的情况,直接调用b.compareTo(a)函数返回对应的大小情况
3.代码实现
//建立大根堆,取出第k大元素
class Solution {
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String a, String b) {
if (a.length() > b.length()) {
return -1;
} else if (a.length() < b.length()) {
return 1;
} else {
return b.compareTo(a);
}
}
};
public String kthLargestNumber(String[] nums, int k) {
PriorityQueue<String> pq = new PriorityQueue<String>(comparator);
for (int i = 0; i < nums.length; i++) {
pq.offer(nums[i]);
}
for (int i = 1; i < k; i++) {
pq.poll();
}
return pq.peek();
}
}