最小的k个数字

news/2024/5/19 23:07:33 标签: leetcode, 算法, 数据结构, c++, 快速排序

剑指 Offer 40. 最小的k个数 - 力扣(LeetCode) (leetcode-cn.com)

两种解法,一个利用最大堆,一个利用快速排序,都不难理解。

目录

利用堆

利用快速排序 


利用堆

代码:

#define top 0
#define NOP 0
class Solution {
    int k;
public:
    vector<int> getLeastNumbers(vector<int>& arr, int K) {
        k = K;
        vector<int> maxHeap(arr.begin(), arr.begin() + k);
        if (!k) return maxHeap;
        for (int pos = k / 2 - 1; pos != -1; --pos) sink(maxHeap, maxHeap[pos], pos);

        int size = arr.size();
        for (int i = k; i != size; ++i) {
            arr[i] < maxHeap[top] ? sink(maxHeap, arr[i], top) : NOP;
        }

        return maxHeap;
    }

    int sink(vector<int>& maxHeap, int pebble, int pos) {
        int bubble;
        while ((bubble = pos * 2 + 1) <= k - 1) {
            bubble != k - 1 && maxHeap[bubble + 1] > maxHeap[bubble] ? ++bubble : NOP;
            if (pebble >= maxHeap[bubble]) break;
            maxHeap[pos] = maxHeap[bubble];
            pos = bubble;
        }
        maxHeap[pos] = pebble;
        return 0;
    }
};

运行结果:

利用快速排序 

代码:

#define NOP 0
class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        if (!k) return {};
        int front = 0, back = arr.size() - 1;
        int separatrix;
        while ((separatrix = partition(arr, front, back)) != k - 1) {
            separatrix > k - 1 ? back = separatrix - 1 : front = separatrix + 1;
        }
        vector<int> ans(arr.begin(), arr.begin() + k);
        return ans;
    }

    int partition(vector<int>& arr, int front, int back) {
        int pivot = arr[back];
        int j = front, i = j - 1;
        while (j != back) {
            arr[j] < pivot ? Fswap(arr[j], arr[++i]) : NOP;
            ++j;
        }
        arr[back] = arr[i + 1];
        arr[i + 1] = pivot;
        return i + 1;
    }

    int Fswap(int& a, int& b) {
        int temp = a;
        a = b;
        b = temp;
        return NOP;
    }
};

运行结果:


http://www.niftyadmin.cn/n/1817356.html

相关文章

Android8.0安装apk报错:Package xxx is currently frozen

问题出现 App版本更新时&#xff0c;使用Android 8.0的手机会出现问题&#xff1a;安装包下载完成之后&#xff0c;屏幕闪了一下并没有跳转到安装界面&#xff0c;使用8.0以下的手机并没有这个问题&#xff0c;查看异常信息&#xff0c;发现如下警告 java.lang.SecurityExcept…

数据流的第K大数值

剑指 Offer II 059. 数据流的第 K 大数值 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com) #define MIN 0x80000000 class KthLargest {int* minHeap;int K; public:KthLargest(int k, vector<int>& nums) {K k;minHeap new int[k 1];int size nums.s…

【达内课程】自定义控件(走势图)

控件选择顺序&#xff1a;原生&#xff0c;开源&#xff0c;自定义控件 今天做一个类似于股票走势图的控件&#xff0c;效果图&#xff1a; 首先先了解下自定义控件的执行流程 新建CustomView CustomView //继承View或View的子类&#xff0c;就是自定义控件 public class …

【达内课程】自定义控件(字幕移动)

创建CustomSurfaceView public class CustomSurfaceView extends SurfaceView {int viewWidth,viewHeight;//管理surfaceviewSurfaceHolder surfaceHolder;public CustomSurfaceView(Context context, AttributeSet attrs) {super(context, attrs);surfaceHolder getHolder()…

【达内课程】自定义控件(下拉刷新)

这一节要实现的效果是下拉刷新 首先需要一个布局头部listview_header <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"andro…

Android 性能优化—— 启动优化

应用启动速度 一个应用App的启动速度能够影响用户的首次体验&#xff0c;启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降&#xff0c;或者卸载放弃该应用程序 本文将从两个方向优化应用的启动速度 : 视觉体验优化代码逻辑优化 视觉优化 应用程序启动有三种…

Android启动界面SplashActivity的实现方法

实现 创建欢迎页SplashActivity public class SplashActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_splash);Handler handler new Handler();ha…