算法 最小的K个数-(快速排序、双指针)

牛客网: 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]
}
相关推荐
景小雨1 天前
【数据结构与算法】排序算法之快速排序(简)
c++·算法·排序算法·快速排序
此去经年ToT17 天前
1004.最大连续1的个数Ⅲ
数据结构·算法·leetcode·双指针·滑动窗口
laufing25 天前
OD C卷 - 幼儿园篮球游戏
双指针·python算法
markingyi25 天前
排序------快速排序(C语言实现)
c语言·数据结构·算法·排序算法·快速排序
GGBondlctrl1 个月前
【数据结构】关于快速排序,归并排序,计数排序,基数排序,你到底了解多少???(超详解)
数据结构·排序算法·归并排序·快速排序·计数排序·基数排序
Tisfy1 个月前
LeetCode 3133.数组最后一个元素的最小值:位运算+双指针
算法·leetcode·二进制·题解·位运算·双指针
狮子座的男孩1 个月前
13、java 数组常见算法(经典案例)、Arrays类的使用(操作数组工具类)、数组常见异常(角标越界或空指针)
java·经验分享·后端·冒泡排序·快速排序·杨辉三角·数组常见异常
理论最高的吻1 个月前
167. 两数之和 II - 输入有序数组【 力扣(LeetCode) 】
数据结构·c++·数学·算法·leetcode·双指针
R.S.G.久夏1 个月前
LeetCode面试题Day10|LeetCode125 验证回文串、LeetCode392 判断子序列
c++·算法·leetcode·贪心算法·双指针
理论最高的吻1 个月前
125. 验证回文串【 力扣(LeetCode) 】
c++·算法·leetcode·职场和发展·双指针·回文串