1985.找出数组中的第 K 大整数

65 阅读1分钟

题目:
给你一个字符串数组 nums 和一个整数 k 。nums 中的每个字符串都表示一个不含前导零的整数。

返回 nums 中表示第 k 大整数的字符串。

注意: 重复的数字在统计时会视为不同元素考虑。例如,如果 nums 是 ["1","2","2"],那么 "2" 是最大的整数,"2" 是第二大的整数,"1" 是第三大的整数。
算法: 注意partition什么时候交换。 nums[j] >nums[right]的时候,和i交换

func kthLargestNumber(nums []string, k int) string {
	left, right := 0, len(nums) - 1
	pivot := partition(nums, left, right)
	for pivot + 1 != k {
		if pivot + 1 < k {
			left = pivot + 1
			pivot = partition(nums, left, right)
		} else {
			right = pivot - 1
			pivot = partition(nums, left, right)
		}

	}
	
	return nums[pivot]
}

func partition(nums []string, left, right int) int {
	if left == right {
		return left
	}
	random(nums, left, right)
	i := left
	for j := i; j < right; j ++ {
		// 降序
		if len(nums[j]) > len(nums[right]) || len(nums[j]) == len(nums[right]) && nums[j] > nums[right] {
			nums[j], nums[i] = nums[i], nums[j]
			i ++
		} 
	}
	nums[right], nums[i] = nums[i], nums[right]
	return i
}


func random(nums []string, left, right int) {
	// fmt.Println(right, left)
	randn := rand.Intn(right - left) + left
	nums[randn], nums[right] = nums[right], nums[randn]
}