牛客网: BM46
题目: 找出数组最小的k个数
思路: 使用快排思想,low = 0, high = n - 1,在low, high之间调整元素位置(使有和同向left=low,right=low双指针或left=low,right=high-1反向双指针),以num[high]为pivot,比pivot小的放左历,比pivot大的放右边,最后将pivot调整至中间,当pivot位置坐标为k-1时,则pivot及其左边的所有元素均为最小的k个数;pivot坐标大于k-1时,调整high=pivot坐标-1;pivot坐标小于k-1时,调整low = pivot坐标+1,直至low 不再小于high,停止。
代码:
Go
// go
package main
// import "fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param input int整型一维数组
* @param k int整型
* @return int整型一维数组
*/
func GetLeastNumbers_Solution( input []int , k int ) []int {
// write code here
if len(input) == 0 || len(input) < k || k == 0 {
return []int{}
}
low := 0
high := len(input) - 1
for low < high {
// 同向双指针
left := low
right := low
pivot := input[high]
for right < high {
if input[right] < pivot {
input[left], input[right] = input[right], input[left]
left++
right++
} else {
right++
}
}
input[left], input[high] = input[high], input[left]
if left == k - 1 {
break
} else if left > k - 1 {
high = left - 1
} else {
low = left + 1
}
}
return input[:k]
}