夯实算法-找出数组中的第 K 大整数

118 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情

题目:LeetCode

给你一个字符串数组 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<=1041 <= k <= nums.length <= 10^4
  • 1 <= nums[i].length <= 100
  • nums[i] 仅由数字组成
  • nums[i] 不含任何前导零

解题思路

根据题意:优先队列只保存K个字符串的个数并且按照大小排序,然后排序将string的数组添加进去, 如果对应的num的长度大于队头或者同等长度就需要判断对应的compare的比较,大的入队列。 如果队列中的数列等于K的数,满足条件就进行数据出队列,再入队列。

代码实现

public static String kthLargestNumber(String[] nums, int k) {
    // 只保留K个字符串的数字 按照从小到大排序
    PriorityQueue < String > minQueue = new PriorityQueue < > ((o1, o2) - > {
        if (o1.length() == o2.length()) {
            return o1.compareTo(o2);
        }
        return o1.length() - o2.length();
    });

    for (String num: nums) {
        if (minQueue.size() == k && (num.length() > minQueue.peek().length() || (num.length() == minQueue.peek().length() && num.compareTo(minQueue.peek()) > 0))) {
            minQueue.poll();
            minQueue.offer(num);
        } else if (minQueue.size() < k) {
            minQueue.offer(num);
        }
    }
    return minQueue.peek();
}

运行结果

Snipaste_2023-02-19_22-15-57.png

复杂度分析

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)  一起分享知识, Keep Learning!