求数组中的第k小元素

news2025/2/26 18:48:14

文章目录

  • 第k小的元素
    • 🔒题目
    • 💡分析
    • 🔑题解
      • 🍃不去重版
      • 🍃去重版

第k小的元素

🔒题目

image-20230220145800496

题目来源:3533. 查找第K小数 - AcWing题库

💡分析

  • 不去重版思路
  • 去重版思路

🔑题解

🍃不去重版

只能对于非重复元素的数组才有效,对于出现了重复元素的数组并不能得到正确答案,所以还需要改进

  • 方式一:采用快速排序策略,核心思想**分治+递归**

    时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),n为数组中元素的个数

    import java.util.Scanner;
    
    /**
     * @author ghp
     * @title 求第k小的元素(不去重版)
     * @description 通过快速排序策略得到数组中第k小的数
     */
    public class Main {
    	public static void main(String[] args) {
    		// 接收输入
    		Scanner sc = new Scanner(System.in);
    		int n = sc.nextInt();
    		int[] arr = new int[n];
    		for (int i = 0; i < n; i++) {
    			arr[i] = sc.nextInt();
    		}
    		int k = sc.nextInt(); // 第k小
    		// 通过快速排序查找到第k小的数
    		int result = findKthByQuickSort(arr, 0, arr.length - 1, k);
    		// 输出第k小的数
    		System.out.println(result);
    	}
    
    	/**
    	 * 通过快速排序查找第k小的数
    	 * @param arr 待查找的数组
    	 * @param left 待查找数组的左侧索引
    	 * @param right 待查找数组的右侧索引
    	 * @param k 第k小
    	 * @return 返回第k小的数,arr中不含有则返回-1
    	 */
    	private static int findKthByQuickSort(int[] arr, int left, int right, int k) {
    		if(left>right) {
    			// 未找到要查找的数,返回-1,递归终止
    			return -1;
    		}
    		// 获取主元
    		int pivot = partition(arr, left, right);
    		int result; // 第k小的元素
    		if (k == pivot - left + 1) {
    			// 第k小的元素就是当前子数组的主元
    			result = arr[pivot];
    		} else if (k < pivot - left + 1) {
    			// 第k小的元素在主元左侧
    			result = findKthByQuickSort(arr, left, pivot - 1, k);
    		} else {
    			// 第k小的元素在主元右侧
    			result = findKthByQuickSort(arr, pivot + 1, right, k - (pivot - left + 1));
    		}
    		// 返回第k小的数
    		return result;
    	}
    
    	/**
    	 * 根据主元划分数组(左侧子数组恒小于等于主元,右侧子数组恒)
    	 * @param arr 待划分的数组
    	 * @param left 待划分数组的左侧索引
    	 * @param right 待划分数组的右侧索引
    	 * @return 返回本次用于划分数组的主元
    	 */
    	private static int partition(int[] arr, int left, int right) {
    		int pivot = arr[right]; // 主元
    		int i = left - 1; // 左右子数组的分界点
    		// 遍历arr,然后根据主元划分出两个子数组
    		for (int j = left; j <= right - 1; j++) {
    			// 将比主元小的数组放到i+1的左侧(注意: i+1也比主元小)
    			if (arr[j] < pivot) {
    				int tmp = arr[i + 1];
    				arr[i + 1] = arr[j];
    				arr[j] = tmp;
    				i++;
    			}
    		}
    		// 将主元放到分界点
    		int temp = arr[i + 1];
    		arr[i + 1] = arr[right];
    		arr[right] = temp;
    		// 返回主元索引
    		return i + 1;
    	}
    }
    

    image-20230220150258388

  • 方式二:调用Java的API,主要思路,先去重,然后通过Arrays.sort()方法进行排序

    时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),n为数组中元素的个数

    import java.util.Arrays;
    import java.util.Scanner;
    
    /**
     * @author ghp
     * @title 求第k小的元素
     * @description
     */
    public class Main {
    	public static void main(String[] args) {
    		// 接收输入
    		Scanner sc = new Scanner(System.in);
    		int n = sc.nextInt();
    		int[] arr = new int[n];
    		for (int i = 0; i < n; i++) {
    			arr[i] = sc.nextInt();
    		}
    		int k = sc.nextInt(); // 第k小
    		// 去除重复元素
    		Arrays.sort(arr);
    		// 输出第k小的数
    		System.out.println(arr[k-1]);
    	}
    }
    

    image-20230220164708025

🍃去重版

  • 方式一:利用Set集合的特性

    核心思想是利用Set集合的特性

    1. Set集合中的元素不可重复
    2. Set集合中的元素默认是升序排序的

    时间复杂度: O ( n ) O(n) O(n)

    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.Scanner;
    import java.util.Set;
    
    /**
     * @author ghp
     * @title 求第k小的元素
     * @description
     */
    public class Main {
    	public static void main(String[] args) {
    		// 接收输入
    		Scanner sc = new Scanner(System.in);
    		int n = sc.nextInt();
    		int[] arr = new int[n];
    		for (int i = 0; i < n; i++) {
    			arr[i] = sc.nextInt();
    		}
    		int k = sc.nextInt(); // 第k小
    		// 去除重复元素
    		int[] nums = Arrays.stream(removeRepeat(arr))
    				.mapToInt(Integer::valueOf).toArray();
    		// 输出第k小的数
    		System.out.println(arr[k-1]);
    	}
    
    	/**
    	 * 去除重复元素
    	 * @param arr
    	 * @return
    	 */
    	private static Integer[] removeRepeat(int[] arr) {
    		Set<Integer> set = new HashSet<>();
    		for (int i = 0; i < arr.length; i++) {
    			set.add(arr[i]);
    		}
    		return set.toArray(new Integer[set.size()]);
    	}
    }
    

image-20230220163947048

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

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

相关文章

华为OD机试 - 斗地主(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

一、【cas搭建单点登录】使用cas搭建单点登录服务器

使用cas搭建单点登录服务器 环境要求 JDK 8CAS 5.2tomcat 8 选用5.x的cas版本是应为要是jdk1.8的版本。 cas版本jdk版本5.x86.x117.x17 模板下载 目前cas的官方文档中&#xff0c;cas官方模板分成了5个大类。cas-sso-server 模板下载地址。 在cas的官方模板库中&#xff…

2023年2月22日PMP®项目管理认证课程正式开课

PMP认证是Project Management Institute在全球范围内推出的针对评价个人项目管理知识能力的资格认证体系。国内众多企业已把PMP认证定为项目经理人必须取得的重要资质。 PMP认证是Project Management Institute在全球范围内推出的针对评价个人项目管理知识能力的资格认证体系。…

微服务之Eureka

&#x1f3e0;个人主页&#xff1a;阿杰的博客 &#x1f4aa;个人简介&#xff1a;大家好&#xff0c;我是阿杰&#xff0c;一个正在努力让自己变得更好的男人&#x1f468; 目前状况&#x1f389;&#xff1a;24届毕业生&#xff0c;奋斗在找实习的路上&#x1f31f; &#x1…

【虚拟机】VirtualBox Host-Only + 主机网络共享配置

文章目录创建Host-Only虚拟机配置主机配置其它工作中经常会使用到虚拟机进行各种技术的试验&#xff0c;之前为了省事常用桥接模式&#xff0c;可是我经常变换办公地点&#xff0c;每个办公地点的局域网网段并不一样&#xff0c;所以我采取了仅主机模式网络共享这种方式&#x…

34-Golang中的结构体!!!

Golang中的结构体结构体和结构体变量(实例)的区别和联系结构体变量(实例)在内存中的布局如何声明结构体字段/属性注意事项和细节说明创建结构体实例的四种方式结构体使用细节结构体和结构体变量(实例)的区别和联系 1.结构体是自定义的数据类型&#xff0c;代表一类事物2.结构体…

C++项目——高并发内存池(3)--central cache整体设计

1.central cache的介绍 1.1框架思想 1.1.1哈希映射 centralcache其实也是哈希桶结构的&#xff0c;并且central cache和thread cacha的哈希映射关系是一致的。目的为了&#xff0c;当thread cache某一个哈希桶下没有内存块时&#xff0c;可以利用之前编写的SizeClass::Index…

论文解读 | [CVPR2019] 基于自适应文本区域表示的任意形状场景文本检测

目录 1 研究背景及意义 2 总体设计 3 方法论 3.1 自适应文本区域表示 3.2 文本建议 3.3 建议改进 4 损失函数 5 实验及结果 1 研究背景及意义 现有的场景文本检测方法使用固定点数的多边形来 表示文本区域。例如&#xff0c;水平文本使用2个点(左上/右下)表示文本区域&…

LinkedList正确的遍历方式-附源码分析

1.引子 记得之前面试过一个同学&#xff0c;有这么一个题目&#xff1a; LinkedList<String> list new LinkedList<>();for (int i 0; i < 1000; i) {list.add(i "");}请根据上面的代码&#xff0c;请选择比较恰当的方式遍历这个集合&#xff0c;并…

七天实现一个分布式缓存

目录教程来源目的思路缓存淘汰(失效)算法&#xff1a;FIFO&#xff0c;LFU 和 LRUFIFO(First In First Out)LFU(Least Frequently Used)LRU(Least Recently Used)实现Lru查找功能删除新增/修改测试单机并发缓存主体结构 Group回调 GetterGroup 的定义Group 的 Get 方法HTTP 服务…

【C++】空间配置器

空间配置器&#xff0c;听起来高大上&#xff0c;那它到底是什么东西呢&#xff1f; 1.什么是空间配置器&#xff1f; 空间配置器是STL源码中实现的一个小灶&#xff0c;用来应对STL容器频繁申请小块内存空间的问题。他算是一个小型的内存池&#xff0c;以提升STL容器在空间申…

AI 生成二次元女孩,免费云端部署(仅需5分钟)

首先需要google的colab&#xff0c;免费版本GPU有额度。其次&#xff0c;打开github网站&#xff0c;选择一个进入colab,修改代码 !apt-get -y install -qq aria2 !pip install -q https://github.com/camenduru/stable-diffusion-webui-colab/releases/download/0.0.16/xforme…

webstom找不到vue全局组件

我真多服气&#xff0c;引入了自动组件注册 // 自动引入组建import { ElementPlusResolver } from unplugin-vue-components/resolversComponents({directoryAsNamespace: true,resolvers: [ElementPlusResolver()]}),生成了 components.d.ts 但是我在webstom中定义了标签 除非…

2023从0开始学性能(1) —— 性能测试基础【持续更新】

背景 不知道各位大佬有没遇到上面的情况&#xff0c;性能这个东西到底是什么&#xff0c;还是以前的358原则吗&#xff1f;明显并不是适用于现在了。多次想踏入性能测试门槛都以失败告终&#xff0c;这次就以系列的方式来督促自己真正踏进性能测试的门槛。 什么是性能测试 通…

九龙证券|机制改革激发转融券活力 全面注册制释放两融展业新空间

在全面注册制准则规矩正式发布的同时&#xff0c;修订后的转融通事务规矩也应约与商场碰头。2月17日&#xff0c;中证金融发布《中国证券金融公司转融通事务规矩&#xff08;试行&#xff09;&#xff08;2023年修订&#xff09;》等规矩&#xff08;简称“转融通新规”&#x…

操作系统(day12)-- 虚拟内存;页面分配策略

虚拟内存管理 虚拟内存的基本概念 传统存储管理方式的特征、缺点 一次性&#xff1a; 作业必须一次性全部装入内存后才能开始运行。驻留性&#xff1a;作业一旦被装入内存&#xff0c;就会一直驻留在内存中&#xff0c;直至作业运行结束。事实上&#xff0c;在一个时间段内&…

秒杀系统设计

1.秒杀系统的特点 瞬时高并发 2.预防措施 2.1.流量限制 对于一个相同的用户&#xff0c;限制请求的频次对于一个相同的IP&#xff0c;限制请求的频次验证码&#xff0c;减缓用户请求的次数活动开启之前&#xff0c;按钮先置灰&#xff0c;防止无效的请求流入系统&#xff0…

企业数智化转型在即,看看低代码软件公司如何做!

在信息爆炸的现代社会中&#xff0c;利用先进技术为企业提升办公协作效率&#xff0c;是一件事半功倍的事。当前&#xff0c;数字化转型升级已经是发展趋势&#xff0c;不少企业已经在朝着数智化转型方向迈进。作为一家低代码软件公司&#xff0c;流辰信息看到了市场发展前景&a…

想玩好ChatGPT?不妨看看这篇文章

相信点进来的铁汁,此时已经对 ChatGPT 有所了解,并想上手体验一番 首先大伙儿要注意,不要被骗了。 现在很多商家提供的 ChatGPT 服务,不仅价格奇高,而且据我所知,有些压根不是 ChatGPT 。 想玩最好去官网注册,具体方法大伙自个儿查一查嗷。 怎么用好 ChatGPT 虽然 …

vue uniapp 微信小程序 搜索下拉框 模糊搜索

vue uniapp 微信小程序 搜索下拉框 模糊搜索 话不多说 直接贴代码 template <template><view class"index"><view class"index_top"><view class"list_text"><view class"list_top_title"><text cl…