1985. 找出数组中的第 K 大整数
题目描述
给你一个字符串数组 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]
不含任何前导零
解法
方法一:排序或快速选择
我们可以将 $\textit{nums}$ 数组中的字符串按照整数从大到小排序,然后取第 $k$ 个元素即可。也可以使用快速选择算法,找到第 $k$ 大的整数。
时间复杂度 $O(n \times \log n)$ 或 $O(n)$,其中 $n$ 是 $\textit{nums}$ 数组的长度。空间复杂度 $O(\log n)$ 或 $O(1)$。
Python3
class Solution:
def kthLargestNumber(self, nums: List[str], k: int) -> str:
return nlargest(k, nums, key=lambda x: int(x))[k - 1]
Java
class Solution {
public String kthLargestNumber(String[] nums, int k) {
Arrays.sort(
nums, (a, b) -> a.length() == b.length() ? b.compareTo(a) : b.length() - a.length());
return nums[k - 1];
}
}
C++
class Solution {
public:
string kthLargestNumber(vector<string>& nums, int k) {
nth_element(nums.begin(), nums.begin() + k - 1, nums.end(), [](const string& a, const string& b) {
return a.size() == b.size() ? a > b : a.size() > b.size();
});
return nums[k - 1];
}
};
Go
func kthLargestNumber(nums []string, k int) string {
sort.Slice(nums, func(i, j int) bool {
a, b := nums[i], nums[j]
if len(a) == len(b) {
return a > b
}
return len(a) > len(b)
})
return nums[k-1]
}