当前位置: 首页 > news >正文

AcWing算法基础课-786第k个数-Java题解

heweilai-bolg-title-image-of-the-article

大家好,我是何未来,本篇文章给大家讲解《AcWing算法基础课》786 题——第 k 个数。本篇文章详细解析了如何使用 Java 实现快速排序算法,以解决查找数组中第 k 个元素的问题。通过深入浅出的讲解,展示了从输入读取到快速排序实现的完整流程,帮助读者理解并掌握这一经典算法的核心思想和应用技巧。

文章目录

  • ❓题目描述
  • 💡算法思路
  • ✅Java代码
  • 🔗参考

❓题目描述

给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。

输入格式

第一行包含两个整数 n 和 k。

第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。

输出格式

输出一个整数,表示数列的第 k 小数。

数据范围

1≤n≤100000,
1≤k≤n

输入样例:

5 3
2 4 1 5 3

输出样例:

3

💡算法思路

  1. 对数列进行快速排序
  2. 找出排序后数列中的第 k 个数

具体实现步骤:

  • 调用QuickSort方法对数组nums进行快速排序。
  • 快速排序的核心思想是选择一个基准值,将数组分为两部分,一部分小于基准值,一部分大于基准值,然后递归地对这两部分进行排序。
  • QuickSort方法中,首先选择一个基准值(这里选择的是中间位置的值),然后使用两个指针ij从数组的两端向中间移动,分别找到第一个大于基准值和小于基准值的元素,并交换它们的位置,以此来分区。
  • 递归地对基准值左右两部分进行快速排序,直到整个数组有序。
  • 排序完成后,直接输出数组中第 k-1 位置的元素,即第 k 个数。

✅Java代码

package basic.sort;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;public class Aw786 {// 创建一个StreamTokenizer对象,用于读取输入流public static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));// 读取下一个整数的方法public static int nextInt() throws IOException {in.nextToken();return (int) in.nval;}public static int n; // 数组的大小public static int k; // 需要找到的第k个数public static int[] nums; // 存储输入的数组public static void main(String[] args) throws IOException {// 读取数组的大小和需要找到的第k个数n = nextInt();k = nextInt();// 初始化数组nums = new int[n];// 读取数组的元素for (int i = 0; i < n; i++) {nums[i] = nextInt();}// 对数组进行快速排序QuickSort(nums, 0, n - 1);// 输出第k个数,数列中的第k个数对应数组下标为k-1System.out.println(nums[k - 1]);}// 快速排序算法public static void QuickSort(int[] a, int l, int r) {// 如果左边界大于或等于右边界,则直接返回if (l >= r) {return;}// 初始化左右指针和基准值int i = l - 1, j = r + 1, x = a[l + r >> 1];// 进行分区操作while (i < j) {do {i++;} while (a[i] < x); // 找到左边大于等于基准值的元素do {j--;} while (a[j] > x); // 找到右边小于等于基准值的元素if (i < j) {// 交换这两个元素int temp = a[i];a[i] = a[j];a[j] = temp;}}// 递归地对左右两个分区进行快速排序QuickSort(a, l, j);QuickSort(a, j + 1, r);}}

🔗参考

  • https://www.acwing.com/problem/content/description/788/
  • https://blog.csdn.net/coder_heweilai/article/details/141720984

作者:程序员何未来-heweilai.com


🔍推荐阅读

  1. AcWing算法基础课-785快速排序-Java题解
  2. 【七夕节实践】把爱心代码放在自己的网站上是什么体验?
  3. 塑造你的技术名片:写给程序员的个人品牌建设指南

欢迎关注我的博客:@程序员何未来,持续为你输出有价值的技术文章~
你们的点赞👍 收藏⭐ 留言🗨️ 关注✅
是我持续创作,输出优质内容的最大动力!谢谢!

文章关键词:算法,计算机算法,算法题解,算法竞赛,Java,数据结构,AcWing算法基础课

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 论文速读|利用局部性提高机器人操作的样本效率
  • Peewee+Postgresql+PooledPostgresqlDatabase重连机制
  • 数据结构————栈、队列
  • Uniapp基础学习(二)
  • Anchor Alignment Metric来优化目标检测的标签分配和损失函数。
  • [数据集][目标检测]西红柿成熟度检测数据集VOC+YOLO格式3241张5类别
  • Ubuntu 修改IP
  • 发烧时眼睛胀痛的多种原因
  • 基于Netty框架的桩直连协议(云快充协议1.5)
  • C++相关概念和易错语法(32)(单例模式、类型转换)
  • leetcode:516 最长回文字序列 动态规划
  • C++基础(7.Stack_Quene_List)
  • Windows10上Nginx如何通过自签名证书方式发布Https服务(上)
  • 第二百一十四节 Java反射 - Java反射字段访问
  • DAY69
  • 0基础学习移动端适配
  • 2017-09-12 前端日报
  • 78. Subsets
  • IDEA 插件开发入门教程
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • magento 货币换算
  • magento2项目上线注意事项
  • mysql常用命令汇总
  • redis学习笔记(三):列表、集合、有序集合
  • spring boot下thymeleaf全局静态变量配置
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • webpack+react项目初体验——记录我的webpack环境配置
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 代理模式
  • 缓存与缓冲
  • 基于组件的设计工作流与界面抽象
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 浅谈Golang中select的用法
  • 深入浅出webpack学习(1)--核心概念
  • 项目管理碎碎念系列之一:干系人管理
  • 新书推荐|Windows黑客编程技术详解
  • 7行Python代码的人脸识别
  • Linux权限管理(week1_day5)--技术流ken
  • 交换综合实验一
  • # 数据结构
  • #pragma 指令
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • %@ page import=%的用法
  • (10)STL算法之搜索(二) 二分查找
  • (39)STM32——FLASH闪存
  • (a /b)*c的值
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十三)Maven插件解析运行机制
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转载)虚函数剖析
  • .Net Core 中间件与过滤器