分治—快速选择算法

在这里插入图片描述

文章目录

    • 🍇215.数组中的第K个最大元素
      • 🍈1. 题目
      • 🍉2. 算法原理
      • 🍊3. 代码实现
    • 🍋LCR 159. 库存管理 III
      • 🍌1. 题目
      • 🍍2. 算法原理
      • 🥭代码实现

🍇215.数组中的第K个最大元素

🍈1. 题目

题目链接:215. 数组中的第K个最大元素 - 力扣(LeetCode)

给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

🍉2. 算法原理

解法一:优先级队列(堆)

一般看到第k个什么什么元素,基本都是采用堆来解决,STL里面内置了堆,也就是priority_queue优先级队列,如果是竞赛或者是考试,可以直接用,如果是平时训练,可以自己手搓一个出来。

解法二:快速选择算法(快排)

快速选择算法是基于快排的

快排的核心思路:从数组里面随机选择一个基准元素,将数组分为三部分,即:>key==key<key

将数组分为三个区域之后,我们只需要看这个第k大的元素落在哪个区间即可,那如何确定第k大的元素在哪个区域,也是三种情况:

  • 设左边区间的元素个数为a个,中间区域的元素为b个,右边区间的元素个数为c

    1. c >= k,又区间都是大元素,我们看看有几个大元素,就能知道,第k个是不是在这个区间内,即[right,l]
    2. 当第一个条件不成立时,我们去中间区域找,也就是b+c >= k,在这个区域直接返回即可
    3. 上述两个条件都不成立的情况下,那我们只能去左侧区域[l,left]寻找,这时候要找的就是第k-b-c大的元素了

    image-20231203082854930

🍊3. 代码实现

堆:

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k)
    {
        int n = nums.size();
        buildMaxHeap(nums, n);
        for(int i=0;i<k-1;i++)
        {
            swap(nums[0],nums[n-1-i]);
            Adjustdown(nums,n-1-i,0);
        }
        return nums[0];
    }

    void buildMaxHeap(vector<int>& nums , int sz)
    {
        for(int i = (sz - 1 -1)/2; i>=0; i--)
        {
            Adjustdown(nums,sz,i);
        }
    }

    void Adjustdown(vector<int>& nums, int sz, int parent)
    {
        int child = parent*2+1;	//默认左孩子大
        while(child<sz)
        {
            if(child+1 < sz && nums[child] < nums[child+1])
            {
                child++;
            }
            if(nums[child] >nums[parent])
            {
                swap(nums[child],nums[parent]);
                parent = child;
                child = parent*2+1;
            }
            else    break;
        }
    }
};

快速选择:

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k)
    {
        srand(time(NULL));
        return quickSort(nums,0,nums.size()-1,k);
    }

    int quickSort(vector<int>& nums, int l, int r, int k)
    {
        if(l == r)  return nums[l];

        int key = getRandom(nums, l, r);
        //数组分为三部分
        int i = l, left = l-1, right = r+1;
        while(i<right)
        {
            if(nums[i] < key)   swap(nums[++left],nums[i++]);
            else if(nums[i] > key)  swap(nums[--right],nums[i]);
            else    i++;
        }

        //查看k在哪个区间
        int c = r - right + 1,
            b = right - left -1;
        if(c >= k)  return quickSort(nums,right,r,k);
        else if(b+c >= k)   return key;
        else    return quickSort(nums,l,left,k-b-c);
    }

    int getRandom(vector<int>& nums, int l, int r)
    {
        return nums[rand()%(r - l + 1) + l];
    }
};

运行结果:

image-20231203085517953

🍋LCR 159. 库存管理 III

🍌1. 题目

题目链接:LCR 159. 库存管理 III

仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限

示例 1:

输入:stock = [2,5,7,4], cnt = 1
输出:[2]

示例 2:

输入:stock = [0,2,3,6], cnt = 2
输出:[0,2][2,0]

提示:

  • 0 <= cnt <= stock.length <= 10000
  • 0 <= stock[i] <= 10000

🍍2. 算法原理

这题就和上面这题差不多,这个是求最小的几个元素,顺序不限,解法很多

解法一:排序

直接排升序,然后返回前k个元素即可,时间复杂度O(N*logN)

解法二:堆

建一个大小为k的大根堆,将数据丢进这个堆,最后堆里面的元素就是我们要找的元素,时间复杂度O(N*logK)

详情可以看此篇文章数据结构——二叉树的3.3Top-K内容

解法三:快速选择算法

依旧是快排的核心思想:选取基准元素+数组分三块,时间复杂度为O(N)

还是这张图:

image-20231203092709344

🥭代码实现

class Solution {
public:
    vector<int> inventoryManagement(vector<int>& stock, int cnt)
    {
        srand(time(NULL));
        quickSort(stock, 0, stock.size()-1, cnt);
        return {stock.begin(),stock.begin()+cnt};
    }

    void quickSort(vector<int>& nums ,int l, int r, int k)
    {
        if(l >= r)  return;

        int key = getRandom(nums,l,r);
        int left = l-1,
            right = r+1,
            i = l;

        while(i<right)
        {
            if(nums[i] < key)   swap(nums[++left],nums[i++]);
            else if(nums[i] > key)  swap(nums[--right],nums[i]);
            else    i++;
        }

        //[l,left] [left+1,right-1] [right,r]
        int a = left - l + 1,
            b = right - left - 1;
        if(a > k)   quickSort(nums,l,left,k);
        else if(a+b >= k)    return;
        else    quickSort(nums,right,r,k-a-b);
    }

    int getRandom(vector<int>&  nums, int l, int r)
    {
        return nums[rand() % (r-l+1) + l];
    }
};

运行结果:

image-20231203093923751

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/212225.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《数据结构与测绘程序设计》试题详细解析(仅供参考)

一. 选择题&#xff08;每空2分&#xff0c;本题共30分&#xff09; &#xff08;1&#xff09;在一个单链表中&#xff0c;已知q所指结点是p所指结点的前驱结点&#xff0c;若在q和p之间插入结点s&#xff0c;则执行( B )。 A. s->nextp->next; p->nexts; B. q…

九章正式推出『智能驾驶产业数据库』

为了更好地研究产业变化趋势&#xff0c;在定性分析之外增加更多定量分析的内容&#xff0c;从而帮助自动驾驶产业内的朋友们更快速、更精准地把握市场变化&#xff0c;2022年底&#xff0c;九章决定要做智能驾驶产业数据库。 历时将近一年后&#xff0c;从敲定数据库负责人&am…

阅读笔记|A Survey of Large Language Models

阅读笔记 模型选择&#xff1a;是否一定要选择参数量巨大的模型&#xff1f;如果需要更好的泛化能力&#xff0c;用于处理非单一的任务&#xff0c;例如对话&#xff0c;则可用选更大的模型&#xff1b;而对于单一明确的任务&#xff0c;则不一定越大越好&#xff0c;参数小一…

L1-015:跟奥巴马一起画方块

题目描述 美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方…

[GPT-1]论文实现:Improving Language Understanding by Generative Pre-Training

Efficient Graph-Based Image Segmentation 一、完整代码二、论文解读2.1 GPT架构2.2 GPT的训练方式Unsupervised pre_trainingSupervised fine_training 三、过程实现3.1 导包3.2 数据处理3.3 模型构建3.4 模型配置 四、整体总结 论文&#xff1a;Improving Language Understa…

前端笔记(一):HTML5 入门学习

前言&#xff1a; 在完成 Java 的 SpringBoot 学习并练习了几个项目后&#xff0c;出于对编程的兴趣和没有组织的局限性&#xff0c;为了开发一些个人的小项目&#xff0c;我将开始前端部分的学习&#xff0c;预计会学到 Vue 框架&#xff0c;同时会把自己的学习笔记发布成博客…

WPF实现文字纵向排布的TabItem

文章目录 基本用法文字竖排显示 WPF布局 基本用法 WPF中的TabControl是一个容器控件&#xff0c;用于在单个窗体或页面中承载多个选项卡。每个选项卡可以包含不同的控件&#xff0c;用于显示不同的内容&#xff0c;其最简单的调用方法如下&#xff0c;只需在TabControl中无脑…

Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2

Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2 概要方法1.打开Qt Creator中的Kit&#xff0c;这里我直接附上几张截图&#xff0c;不同的版本打开位置可能有所不同&#xff0c;总之最终目的是要打开构建套件&#xff08;Kit&#xff09;2.可以看到构建套件里面有包含了“构建套件K…

Java基础-----Date类及其相关类(一)

文章目录 1. Date类1.1 简介1.2 构造方法1.3 主要方法 2. DateFormat 类2.1 简介2.2 实例化方式一&#xff1a;通过静态方法的调用2.2 实例化方式二&#xff1a;通过创建子类对象 3. Calendar类4. GregorianCalendar 1. Date类 1.1 简介 java.util.Date:表示指定的时间信息&a…

Structured Streaming: Apache Spark的流处理引擎

欢迎来到我们的技术博客&#xff01;今天&#xff0c;我们要探讨的主题是Apache Spark的一个核心组件——Structured Streaming。作为一个可扩展且容错的流处理引擎&#xff0c;Structured Streaming使得处理实时数据流变得更加高效和简便。 什么是Structured Streaming&#…

高端大气简历模板(精选8篇)

想要让简历在众多求职者中脱颖而出&#xff0c;吸引HR的眼球吗&#xff0c;可以看看这8篇精选的高端大气简历模板&#xff01;本文为大家提供了多种行业、职位的简历案例&#xff0c;助大家打造一份令人惊艳的简历&#xff0c;轻松斩获心仪职位&#xff01; 高端大气简历模板下…

【Vulnhub 靶场】【HackathonCTF: 2】【简单】【20210620】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hackathonctf-2,714/ 靶场下载&#xff1a;https://download.vulnhub.com/hackathonctf/Hackathon2.zip 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年06月20日 文件大小&#xff1a;2.6 GB 靶场作者&…

Opencv拖动条控制均值滤波卷积核大小,拖动条控制是否保存(涉及知识点:cv2.createTrackbar和cv2.getTrackbarPos的使用)

带拖动条的均值滤波import timeimport cv2 import numpy as npdef callback(int):passcv2.namedWindow(dst,cv2.WINDOW_AUTOSIZE)# 创建trackbar (trackbarname,winname,value,count,callback,userdata) cv2.createTrackbar(ksize, dst, 3, 30, callback) cv2.createTrackbar(s…

基于Amazon Bedrock的企业级生成式AI平台

基于Amazon Bedrock的企业级生成式AI平台 2023.12.2版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 Amazon Bedrock 是一项新的 AWS 服务&#xff0c;可让企业通过 API 轻松利用和自定义生成式 AI 模型。公司现在可以构建和扩展人工智能应…

Kubernetes学习笔记-Part.09 K8s集群构建

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第九章 K8s集群构建 9.1.集群初始化 集群初始化是首…

vue项目node-sass^4.14.1 python gyp 报错解决办法

npm i node-sass4.14.1 --sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass/参考链接&#xff1a;链接

主要分布式文件系统架构对比分析:GFS vs. Tectonic vs. JuiceFS

随着技术的进步和数据的不断爆炸&#xff0c;传统的磁盘文件系统已经暴露出它们的局限性。为了满足不断增长的存储需求&#xff0c;分布式文件系统作为动态且可扩展的解决方案应运而生。在本文中&#xff0c;我们探讨了三种代表性分布式文件系统的设计原则、创新和解决的挑战&a…

网站有必要使用SSL证书吗

随着互联网的快速发展&#xff0c;网络安全问题也变得日益突出&#xff0c;SSL证书的作用日益凸显。 什么是SSL证书&#xff1f; SSL证书&#xff08;Secure Sockets Layer Certificate&#xff09;&#xff0c;也称为TLS证书&#xff08;Transport Layer Security Certifica…

基于springboot,vue高校图书馆管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatisredis 本项…

工业机器视觉megauging(向光有光)使用说明书(十二,轻量级的visionpro)

关于最后一个工具的介绍&#xff1a;就是这个“相机图像” 我们可以鼠标双击点进去看一看&#xff1a; 在图像上点击&#xff0c;就可以截取一块图像&#xff0c;是可以放大缩小的&#xff0c;这个放大很low&#xff0c;是我以前研究缩放入门时的版本&#xff0c;本想删除&…