You are given an array of strings nums
and an integer k
. Each string in nums
represents an integer without leading zeros.
Return the string that represents the kth
largest integer in nums
.
Note: Duplicate numbers should be counted distinctly. For example, if nums
is ["1","2","2"]
, "2"
is the first largest integer, "2"
is the second-largest integer, and "1"
is the third-largest integer.
Example 1:
Input: nums = ["3","6","7","10"], k = 4 Output: "3" Explanation: The numbers in nums sorted in non-decreasing order are ["3","6","7","10"]. The 4th largest integer in nums is "3".
Example 2:
Input: nums = ["2","21","12","1"], k = 3 Output: "2" Explanation: The numbers in nums sorted in non-decreasing order are ["1","2","12","21"]. The 3rd largest integer in nums is "2".
Example 3:
Input: nums = ["0","0"], k = 2 Output: "0" Explanation: The numbers in nums sorted in non-decreasing order are ["0","0"]. The 2nd largest integer in nums is "0".
Constraints:
1 <= k <= nums.length <= 104
1 <= nums[i].length <= 100
nums[i]
consists of only digits.nums[i]
will not have any leading zeros.
思路: quick select. O(n*M); M is word length;
class Solution {
public String kthLargestNumber(String[] nums, int k) {
return String.valueOf(findKth(nums, 0, nums.length - 1, k));
}
private String findKth(String[] A, int start, int end, int k) {
if(start == end) {
return A[start];
}
int i = start; int j = end;
int mid = start + (end - start) / 2;
String pivot = A[mid];
while(i <= j) {
while(i <= j && compare(A[i], pivot) > 0) {
i++;
}
while(i <= j && compare(A[j], pivot) < 0) {
j--;
}
if(i <= j) {
String temp = A[i];
A[i] = A[j];
A[j] = temp;
i++;
j--;
}
}
if(start + k - 1 <= j) {
return findKth(A, start, j, k);
}
if(start + k - 1 >= i) {
return findKth(A, i, end, k - (i - start));
}
return A[j + 1];
}
private int compare(String a, String b) {
if(a.length() == b.length()) {
return a.compareTo(b);
} else {
return a.length() - b.length();
}
}
}