Acwing 786.第K个数

Acwing 786.第K个数

题目描述

786. 第k个数 - AcWing题库

运行代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int q[N];int main()
{int n, k;scanf("%d%d", &n, &k);for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);nth_element(q, q + k - 1, q + n);printf("%d ", q[k - 1]);return 0;
}

代码思路

  1. 引入头文件和命名空间:#include <iostream> 用于输入输出操作。#include <algorithm> 引入算法库,包含nth_element函数。using namespace std; 允许直接使用标准库中的名称,而无需std::前缀。

  2. 定义常量和变量:const int N = 100010; 定义数组的最大容量。int q[N]; 定义一个足够大的数组来存储输入的整数。

  3. 主函数main:

    • 读取数据:首先,读取两个整数nk,分别代表数组的元素个数和要找的第k小的元素的位置(从1开始计数)。然后,通过一个循环读取n个整数并存储到数组q中。

    • 使用nth_element:nth_element(q, q + k - 1, q + n); 这行代码是关键,它将数组q中的元素进行部分排序,使得第k小的元素(按照默认升序排序的标准)正好位于q[k - 1]的位置。nth_element不会保证整个数组有序,只是保证第k个元素就位,它前面的元素都不大于它,后面的元素都不小于它,这就足够找到第k小的元素。

    • 输出结果:printf("%d ", q[k - 1]); 输出找到的第k小的元素。

  4. 返回0:return 0; 表示程序正常结束。

代码思路总结: 这段代码简洁高效地实现了寻找数组中第k小元素的任务,利用了nth_element函数的高效性,特别适合于当只需要找到一个特定位置的元素而不需要全数组排序的场景,大大提高了算法效率。

另外思路

#include<iostream>
using namespace std;
const int N=1e6+6;
int n;int k;
int q[N];
void qs(int q[], int l, int r){if (l>=r)return;int x = q[l];int i = l-1;int j = r+1;while(i<j){do i++;while(q[i]<x);do j--;while(q[j]>x);if(i < j)swap(q[i], q[j]);}qs(q,l,j);qs(q,j+1,r);
}
int main(){cin >> n >> k;for(int i = 0; i < n; ++i){cin >> q[i];}qs(q,0,n-1);cout << q[k-1];return 0;
}

代码思路

  1. 头文件和命名空间:

    • #include<iostream> 用于输入输出操作。
    • using namespace std; 允许直接使用标准库中的名称,如coutcin,而不必加std::前缀。
  2. 常量定义和变量声明:

    • const int N = 1e6 + 6; 定义了一个常量N,用于设定数组的最大容量。
    • int n; int k; 声明了两个整型变量,分别用于存储数组长度和要找的第k小的元素的位置。
    • int q[N]; 定义了一个足够大的数组来存储输入的整数序列。
  3. 快速排序函数qs:

    • 函数接受一个整数数组q[]及其左右边界索引lr作为参数。
    • 选择数组的第一个元素q[l]作为基准值x
    • 初始化两个指针ij,分别位于l-1r+1,用于从两边向中间扫描。
    • 使用循环,在q[i]不大于xq[j]不小于x时,向中间移动这两个指针,并在适当时候交换两者所指的元素,以确保左侧元素都不大于x,右侧元素都不小于x
    • ij交错时,基准值x的最终位置确定在j,此时基准值左侧的元素都小于等于它,右侧的元素都大于等于它。
    • 递归调用qs函数分别对基准值左侧和右侧的子序列进行快速排序。
  4. 主函数main:

    • 读取整数n(数组长度)和k(要找的第k小元素的位置)。
    • 通过循环读取数组q[]中的每个整数。
    • 调用快速排序函数qs(q, 0, n - 1)对数组进行排序。
    • 输出排序后数组中第k小的元素,即q[k-1],因为数组索引是从0开始的。

代码在处理大量数据或极端情况时可能不是最优选择,特别是在快速排序最坏情况下的时间复杂度为O(n^2),虽然平均时间复杂度为O(n log n)。对于寻找第k小的元素,有时候使用快速选择算法(基于快速排序思想的优化版本,避免完全排序)会更高效。

改进思路

将原有的快速排序改为快速选择算法,因为我们的目标不是完全排序数组,而是找到第k小的元素。这样可以减少不必要的比较和交换,提高效率,尤其是在k相对较小的情况下。快速选择算法的关键在于只对与k相关的部分进行排序,具体改进如下:

  1. 修改分区函数:调整分区逻辑,仅保证基准元素到达其最终排序位置,而不需要对整个数组进行排序。
  2. 直接返回第k小的元素:在快速选择过程中,一旦找到正确的分区,直接返回第k小的元素,无需完成整个数组的排序。

改进代码

#include<iostream>
#include<climits>
using namespace std;const int N = 1e6 + 6;int partition(int arr[], int l, int r) {int pivot = arr[r]; // 选择最右侧元素作为基准int i = l - 1;for(int j = l; j < r; ++j) {if(arr[j] <= pivot) {i++;swap(arr[i], arr[j]);}}swap(arr[i + 1], arr[r]); // 把基准元素放到正确的位置return i + 1;
}int select(int arr[], int l, int r, int k) {if(l == r) return arr[l];int pivot_index = partition(arr, l, r);if(k == pivot_index) {return arr[k];} else if(k < pivot_index) {return select(arr, l, pivot_index - 1, k);} else {return select(arr, pivot_index + 1, r, k);}
}int main() {int n, k;cin >> n >> k;int q[N];for(int i = 0; i < n; ++i) {cin >> q[i];}--k; // 数组索引从0开始cout << select(q, 0, n - 1, k) << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv进阶 ——(十三)基于三角剖分实现换脸

换脸的关键在于人脸对齐&#xff0c;人脸对齐主要包括以下几点&#xff1a; 1、人脸可能存在一定的角度&#xff0c;因此需要先将倾斜方向进行对齐 2、大小对齐&#xff0c;将模板人脸的大小缩放到同一大小 3、要想有好的效果&#xff0c;关键点选取很重要 4、人脸对齐后&a…

黑马python-JavaScript

1.JavaScript的定义&#xff1a; JavaScript是运行在浏览器端的脚步语言&#xff0c;是由浏览器解释执行的、简称js。它能够让网页和用户有交互功能&#xff0c;增加良好的用户体验效果 2.使用方式&#xff1a; 1.行内式&#xff08;主要用于事件&#xff09; <input type&q…

【大数据】计算引擎:Spark核心概念

目录 前言 1.什么是Spark 2.核心概念 2.1.Spark如何拉高计算性能 2.2.RDD 2.3.Stage 3.运行流程 前言 本文是作者大数据系列中的一文&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?spm1001.2014.3001.5482 该系列会成体…

JAVA技术设计模式

设计模式结构图 设计原则 职责单一原则接口隔离原则 一个类对另一个类的依赖应该建立在最小的接口上 依赖倒置面向接口编程,参数或变量,依赖注入,使用父类 开闭原则 对扩展开放(对提供方),对修改关闭(对使用方) 用抽象构建框架,用实现扩展细节 里氏替换原则…

java中的双列集合(Map,HashMap,TreeMap,LinkedHashMap)

双列集合的特点 双列集合一次需要存一对数据&#xff0c;分别为键和值 键不能重复&#xff0c;值可以重复 键和值是一一对应的&#xff0c;每一个键只能找到自己对应的值 键值这个整体 &#xff0c;我们称之为“键值对”或者“键值对对象”&#xff0c;在Java中叫做“Entry对象…

CAPL如何发送一条UDP报文

UDP作为传输层协议,本身并不具有可靠性传输特点,所以不需要建立连接通道,可以直接发送数据。当然,前提是需要知道对方的通信端点,也就是IP地址和端口号。 端口号是传输层协议中最显著的特征,传输层根据它来确定上层绑定的应用程序,以达到把数据交给上层应用处理的目的。…

【Pytorch】计算机视觉项目——卷积神经网络TinyVGG模型图像分类(模型预测)

介绍 这篇文章是《【Pytorch】计算机视觉项目——卷积神经网络TinyVGG模型图像分类&#xff08;如何使用自定义数据集&#xff09;》的最后一部分内容&#xff1a;模型预测。 在本文中&#xff0c;我们将介绍如何测试模型的预测效果——让已训练好模型对一张新的图片进行分类&a…

在 SEO 中,一个好的网页必须具备哪些 HTML 标签和属性?

搜索引擎优化 &#xff08;SEO&#xff09; 是涉及提高网站在搜索引擎上的可见性的过程。这是通过提高网站在搜索引擎结果页面&#xff08;例如Google&#xff09;上的排名来实现的。网站在这些页面上的显示位置越高&#xff0c;就越有可能获得更大的流量。 搜索引擎优化涉及了…

跑mask2former(自用)

1. 运行docker 基本命令&#xff1a; sudo docker ps -a &#xff08;列出所有容器状态&#xff09; sudo docker run -dit -v /hdd/lyh/mask2former:/mask --gpus "device0,1" --shm-size 16G --name mask 11.1:v6 &#xff08;创建docker容器&…

Mac系统使用COLMAP

安装教程 如有出入&#xff0c;参照官网手册最新版 Installation — COLMAP 3.9-dev documentation 首先确保mac上安装了Homebrew 1.安装依赖项 brew install \cmake \ninja \boost \eigen \flann \freeimage \metis \glog \googletest \ceres-solver \qt5 \glew \cgal \s…

万里长城第一步——尚庭公寓【技术概述】

简略版&#xff1a; 项目概述主要是移动端&#xff08;房源检索&#xff1b;预约看房&#xff0c;租赁管理&#xff0c;浏览历史&#xff09;和后台管理&#xff08;管理员对房源进行操作&#xff09;&#xff1b; 项目使用前后端分离的方法&#xff0c;主要以后端为主&#xf…

rpm安装

rpm安装 命令格式&#xff1a; rpm 【选项】 文件名 选项&#xff1a; -i&#xff1a;安装软件 -v:显示安装过程信息 -h:用#表示安装进度&#xff0c;一个#代表2% -ivh&#xff1a;安装软件&#xff0c;显示安装过程 -e:卸载软件 -q:查看软件是否安装 -ql&#xff1…

信息系统项目管理师0147:工具与技术(9项目范围管理—9.3规划范围管理—9.3.2工具与技术)

点击查看专栏目录 文章目录 9.3.2 工具与技术 9.3.2 工具与技术 专家判断 规划范围管理过程中&#xff0c;应征求具备如下领域相关专业知识或接受过相关培训的个人或小组 的意见&#xff0c;涉及的领域包括&#xff1a;以往类似项目&#xff1b;特定行业、学科和应用领域的信息…

学习anjuke的过程

一、抓包 先看看12.25.1版本的APP是不是还能使用&#xff0c;如果还能使用我们就先破解低版本的。打开APP后发现还能正常使用&#xff0c;因为低版本的难度低我们就破解这个版本。低版本和高版本的算法是一样的&#xff0c;算法破解之后我们后续抓包替换接口就行了。手机安装上…

SQLAlchemy 模型中数据的错误表示

1. 问题背景 在使用 SQLAlchemy 0.6.0 版本&#xff08;也曾尝试使用 0.6.4 版本&#xff09;的 Pylons 应用程序中遇到了一个 SQLAlchemy ORM 问题。该问题出现在使用 psycopg2 作为数据库驱动程序、连接至 Postgresql 8.2 数据库的环境中。定义了一个 User 模型对象&#xf…

FreeRTOS基础(十一):消息队列

本文将详细全方位的讲解FreeRTOS的消息队列&#xff0c;其实在FreeRTOS中消息队列的重要性也不言而喻&#xff0c;与FreeRTOS任务调度同等重要&#xff0c;因为后面的各种信号量基本都是基于消息队列的。 目录 一、消息队列的简介 1.1 产生的原因 1.2 消息队列的解决办法 …

【数据库】SQL零基础入门学习

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

重邮计算机网络803-(2)物理层

一.物理层 1.介绍 物理层的主要任务描述为确定与传输媒体的接口的一些特性&#xff0c;即&#xff1a; ①机械特性 指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等等。 ②电气特性 指明在接口电缆的各条线上出现的电压的范围。 ③功能特性 指明某条线上…

B=2W,奈奎斯特极限定理详解

一直没搞明白奈奎斯特极限定理的含义&#xff0c;网上搜了很久也没得到答案。最近深思几天后&#xff0c;终于有了点心得。顺便吐槽一下&#xff0c;csdn的提问栏目&#xff0c;有很多人用chatgpt秒回这个事&#xff0c;实在是解决不了问题&#xff0c;有时候人的问题大多数都是…

HDFS 之 DataNode 核心知识点

优质博文&#xff1a;IT-BLOG-CN 一、DataNode工作机制 DataNode工作机制&#xff0c;如下所示&#xff1a; 【1】一个数据块在 DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c…