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

【练习】分治--快排思想

  • 🎥 个人主页:Dikz12
  • 🔥个人专栏:算法(Java)
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

目录

颜色分类

题目描述 

题解  

代码实现

排序数组

题目描述 

 题解

代码实现 

数组中的第k个最大元素

题目描述 

 题解

​编辑 代码实现

库存管理III( 最小k个数)

题目描述 

​编辑 题解

代码实现 


                                                   分治:分而治之. 

颜色分类

题目描述 

题解  

 解法:三指针(数组分三块).

 

代码实现

    public void sortColors(int[] nums) {int i = 0, left = -1, right = nums.length;while(i < right) {if (nums[i] == 0) {swap(nums,++left,i++);} else if (nums[i] == 1) {i++;}else {swap(nums,--right,i);}} }public void swap(int[] nums, int i , int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}

排序数组

题目描述 

 题解

 解法:快速排序(数组分三块+随机选择基准).

快排最核⼼的⼀步就是 Partition (分割数 据):将数据按照⼀个标准,分成左右两部分。
这里 不是使用的是将数组分成两部分(挖坑法、Hoare法)。

而是使⽤荷兰国旗问题的思想,将数组划分为 左 中 右 三部分:左边是⽐基准元素⼩的数据, 中间是与基准元素相同的数据,右边是⽐基准元素⼤的数据。然后再去递归的排序左边部分和右边 部分即可(可以舍去⼤量的中间部分)。
在处理数据量有很多重复的情况下,效率会⼤⼤提升!!!

数组分三块,过程就跟上题一样就不在进行详述.

优化方式有:随机选择基准 和 三位取中.

 

代码实现 

    public int[] sortArray(int[] nums) {qsort(nums,0,nums.length - 1);return nums;}public void qsort(int[] nums,int l , int r) {//递归结束if (l >= r) {return;}//数组分三块int key = nums[new Random().nextInt(r - l + 1) + l];int left = l - 1, i = l, right = r + 1;while(i < right) {if(nums[i] < key) {swap(nums,++left,i++);}else if (nums[i] == key) {i++;} else {swap(nums,--right,i);}}//[0,left]  [left+1,right-1]  [right,r]qsort(nums,l,left);qsort(nums,right,r);}public void swap(int[] nums,int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}

 挖坑法、Hoare法+优化:

 数组分三块+优化

数组中的第k个最大元素

题目描述 

 

 题解

解法:快速选择算法(数组分三块+随机选取基准元素) 。

在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1]
[right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出我们要找的元素是
在「哪⼀个区间」⾥⾯。 那么我们可以直接去「相应的区间」去寻找最终结果就好了。

 代码实现

    public int findKthLargest(int[] nums, int k) {return qsort(nums,0,nums.length-1,k);}public int qsort(int[] nums,int l ,int r, int k) {//结束条件if (l >= r) {return nums[l];}//1.随机选取基准int key = nums[new Random().nextInt(r - l + 1) + l];//2.数组分"三块"int i = l , left = l - 1, right = r + 1;while(i < right) {if(nums[i] < key) {swap(nums,++left,i++);} else if (nums[i] == key) {i++;} else{swap(nums,--right,i);}}// 3.区间个数 [l,left]  [left + 1, right - 1]  [right,r]int b = right - left - 1, c = r - right + 1;if(c >= k) {return qsort(nums,right,r,k);} else if (b + c >= k) {return key;} else {return qsort(nums,l,left,k - c - b);}}public void swap(int[] nums, int i , int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}

库存管理III( 最小k个数)

题目描述 

 题解

解法一:堆排.(大根堆)O(NlogN).

解法二:快速选择算法(数组分三块+随机选取基准元素) O(N) 

在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1]
[right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出最⼩的 k 个数在哪
些区间⾥⾯。 那么我们可以直接去「相应的区间」继续划分数组即可。

 

代码实现 

    public int[] inventoryManagement(int[] nums, int cnt) {qsort(nums,0,nums.length-1,cnt);int[] ret = new int[cnt];for(int i = 0; i < cnt; i++) {ret[i] = nums[i];}return ret;}public void qsort(int[] nums, int l, int r, int k) {if(l >= r) {return;}//1.随机选取基准int key = nums[new Random().nextInt(r - l + 1) + l];//2.数组分三块int i = l, left = l - 1,right = r + 1;while(i < right) {if(nums[i] < key) {swap(nums,++left,i++);} else if (nums[i] == key) {i++;} else {swap(nums,--right,i);}}//3. [l,left]  [left+1,right-1]  [right,r]int a = left - l + 1, b = right - left - 1;if (a >= k) {qsort(nums,l,left,k);} else if(a + b >= k) {return;} else {qsort(nums,right,r,k - a - b);}}public void swap(int[] nums, int i , int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}

 

相关文章:

【练习】分治--快排思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 颜色分类 题目描述 题解 代码实现 排序数组 题目描述 题解 代码…...

Unity读书系列《Unity高级编程:主程手记》——C#技术要点

文章目录 前言一、业务逻辑优化技巧二、Unity3d中C#的底层原理三、List底层源码剖析四、Dictionary底层源码剖析五、浮点数的精度问题六、委托、事件、装箱、拆箱七、算法总结 前言 本文旨在总结某一概念的性质&#xff0c;并引出相关的技术要点。如果读者希望深入了解相关技术…...

Redis分片集群

哨兵集群虽然解决了高可用和高并发读问题&#xff0c;但是还是有缺陷 1. 因为是主节点是单节点&#xff0c;并发写存在瓶颈 2.数据量大了每个节点存储相同的数据&#xff0c;造成内存紧张&#xff0c;资源浪费 redis.conf文件 port 6379 # 开启集群功能 cluster-enabled yes…...

Math.Round()函数说明

Math.Round()并不是严格意义上的是四舍五入函数。它默认的执行的是“银行家舍入”算法&#xff0c;即四舍六入五取偶。概括为&#xff1a;四舍六入五考虑、五后非零就进一&#xff0c;五后皆零看奇偶&#xff0c;五前为偶应舍去、五前为奇要进一。 当为5时&#xff0c;取离着最…...

001 定期同步mysql数据到es 删除数据库记录同时删除es记录 es全文搜索分词和高亮

文章目录 ProductController.javaProduct.javaElasticsearchSyncListener.javaProductElasticSearchMapper.javaProductMapper.javaProductDeletedEvent.javaProductServiceImpl.javaSyncProductService.javaIProductService.javaElasticSearchSpringDemoApplication.javaServl…...

Vue 快速入门:Vue初级

语法规则 前端渲染 渲染有几种方式&#xff1a;原生js、js模板、Vue模板语法 原生js 使用字符串拼接 js模板语法 Vue.js 模板语法概述 Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;其模板语法非常灵活和直观。Vue 的模板语法基于 HTML&#xff0c;可以通过指令…...

什么是IP跳变?

IP 跳跃&#xff08;也称为 IP 跳动&#xff09;的概念已引起使用代理访问网站的用户的极大关注。但 IP 跳跃到底是什么&#xff1f;为什么它对于各种在线活动至关重要&#xff1f; 在本文中&#xff0c;我们将深入探讨 IP 跳跃的世界&#xff0c;探索其实际应用、用例、潜在问…...

Linux服务器lvm磁盘管理fdisk和df磁盘大小不同修改

服务器端由于硬盘是通过VCenter原来100G磁盘复制的虚拟机,复制完成后,原来100G的磁盘通过选择 磁盘重新复制出150G的磁盘,开机后发现还是原来的100G的磁盘,通过fdisk -l 查看有个sdb是150G, 但是已经划转的lvm盘只有100G, 通过df查看也是原来的100G: pvs查看pv里也是10…...

AOP是什么和OOP的区别

AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;和OOP&#xff08;Object-Oriented Programming&#xff0c;面向对象编程&#xff09;是两种不同的编程范式&#xff0c;它们在多个方面存在显著的差异。 编程思想&#xff1a; AOP&#xff1…...

Clickhouse 字符串函数 - 2

reverse​ 反转字符串。 reverseUTF8​ 以Unicode字符为单位反转UTF-8编码的字符串。如果字符串不是UTF-8编码&#xff0c;则可能获取到一个非预期的结果&#xff08;不会抛出异常&#xff09;。 format(pattern, s0, s1, …)​ 使用常量字符串pattern格式化其他参数。pat…...

【个人成长】Fitten Code 测试案例分析

JS&#xff0c;Fitten Code 当插件&#xff0c;然后在代码分析的时候&#xff0c;有些小感悟&#xff0c;大模型写代码的思路&#xff0c;正常我理解的代码思路。 输入代码 (item.score* 100).toFixed(0)Prompt 得出的结果 5分&#xff0c;如果超过100按100算输出结果 con…...

管理Anaconda虚拟环境的实用指南

Anaconda是一个开源的Python数据科学平台&#xff0c;它提供了一个管理包和环境的强大工具。在这篇文章中&#xff0c;我们将探讨如何在Anaconda中创建、克隆、切换和管理虚拟环境&#xff0c;以及如何升级Python版本和更新conda本身。 切换Anaconda环境 在Anaconda中&#x…...

python如何在图片上写斜体字

在Python中&#xff0c;直接在图片上写斜体文字通常不是图像库&#xff08;如PIL或OpenCV&#xff09;的内置功能&#xff0c;因为这些库主要关注于图像处理而非复杂的文本渲染。然而&#xff0c;你可以通过几种方式在图片上创建斜体效果&#xff1a; 使用PIL&#xff08;Pytho…...

算法练习第22天|39. 组合总和、40.组合总和II

39. 组合总和 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/combination-sum/description/ 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数…...

CCF PTA 2022年11月C++大富翁游戏

【问题描述】 小明很喜欢玩大富翁游戏&#xff0c;这个游戏的规则如下&#xff1a; 1、游戏地图是有 N 个格子&#xff0c;分别编号从 1 到 N。玩家一开始位于 1 号格子。 2、地图的每个格子上都有事件&#xff0c;事件有以下两种类型&#xff1a; A&#xff09;罚款 x 枚金币…...

React获取form表单值的N种方式

Ref模式&#xff08;非受控模式&#xff09; 非钩子模式 1.createRef()方式 js: userNameElcreateRef() <input type"text" name"userName" ref{this.userNameEl} /> 获取值的方式&#xff1a; this.userNameEl.current.value2.refs(废弃) js: con…...

Apache Knox 2.0.0使用

目录 介绍 使用 gateway-site.xml users.ldif my_hdfs.xml my_yarn.xml 其它 介绍 The Apache Knox Gateway is a system that provides a single point of authentication and access for Apache Hadoop services in a cluster. The goal is to simplify Hadoop securit…...

Tomcat 内核详解 - Web服务器机制

详细介绍 Apache Tomcat 是一个开源的Web服务器和Servlet容器&#xff0c;它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件&#xff0c;它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。 Apac…...

几个人脸库对于面部动作识别的功能比较

经粗略研究,insightface只能识别面部特征点的位置,根据这些位置不能直接推出一个人是否在睡觉。 OpenFace 是一个高级的面部行为分析工具,它能够识别和分析多种面部动作单位(Facial Action Coding System, FACS),这些动作单位是根据面部肌肉活动定义的。每个动作单位(A…...

IDEA 使用Alibaba Cloud Toolkit 实现远程 自动部署

安装插件 maven方式部署 配置服务器主机信息 配置发布到主机 单击Select 单击run 就可以将选择module的jar文件上传到服务器的指定位置了 Alibaba Cloud Toolkit 上传文件的方式部署...

SpringBoot3 + JDK17 项目实战:用MyBatis-Plus和Redis快速搭建一个用户管理系统

SpringBoot3 JDK17 实战&#xff1a;构建高性能用户管理系统 最近在重构公司内部的管理系统时&#xff0c;我选择了SpringBoot3和JDK17这套组合。新版本带来的性能提升和语法糖让开发效率提高了不少&#xff0c;特别是记录日志和编写Lambda表达式时。本文将带你从零开始&#…...

SAP PP实战指南:从零到一掌握BOM创建、群组BOM配置与CS01核心操作

1. BOM基础概念与核心价值 物料清单&#xff08;Bill of Materials&#xff0c;简称BOM&#xff09;是制造业的DNA图谱&#xff0c;它用结构化数据描述产品从原材料到成品的完整演化路径。我第一次接触SAP PP模块时&#xff0c;项目经理指着屏幕上的BOM结构说&#xff1a;"…...

电磁仿真进阶--CST空心电感建模与实测验证全流程

1. 空心电感建模与仿真的工程价值 空心电感作为高频电路中的核心无源器件&#xff0c;其性能直接影响射频前端、滤波电路等关键模块的工作表现。与传统带磁芯的电感不同&#xff0c;空心电感避免了磁饱和问题&#xff0c;但同时也面临着建模复杂度高、高频特性难以准确预测的挑…...

N_m3u8DL-RE:跨平台流媒体下载终极指南,三行命令破解加密视频

N_m3u8DL-RE&#xff1a;跨平台流媒体下载终极指南&#xff0c;三行命令破解加密视频 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/…...

TikTok 短视频生成工具哪家好?TikTok 爆款视频复刻,有什么工具推荐

在 TikTok 流量竞争愈发激烈的 2026 年&#xff0c;想要快速起号、稳定爆单&#xff0c;离不开优质短视频量产和爆款视频复刻。不用从零原创创作&#xff0c;借助成熟 AI 工具复刻平台热门爆款&#xff0c;已经成为跨境卖家和内容创作者的主流玩法。 不少人都在纠结两大问题&a…...

linux service和systemctl命令、systemd

文章目录service命令(老版本)systemctl命令(推荐)systemdsystemd示例-Hello Worldsystemd语法如何查看service对应的脚本service命令(老版本) 都是服务控制相关的命令&#xff0c;差别不大&#xff0c;之前用service&#xff0c;现在一般用systemctl。 service命令例子&#…...

2026年腾讯云OpenClaw/Hermes Agent配置Token Plan集成步骤解析

2026年腾讯云OpenClaw/Hermes Agent配置Token Plan集成步骤解析。OpenClaw是开源的个人AI助手&#xff0c;Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...

LLaMA论文里没细说的三个“小”改进:RMSNorm、SwiGLU和RoPE到底强在哪?

LLaMA模型三大底层优化技术解析&#xff1a;RMSNorm、SwiGLU与RoPE的设计哲学 当大多数人关注大语言模型的参数量级时&#xff0c;LLaMA团队却在微观架构层面做了一系列精妙改进。这些看似微小的技术选择&#xff0c;实则是支撑模型高效运行的关键支柱。本文将带您深入LLaMA的&…...

保姆级教程:用Node-RED把传感器数据传到ThingsBoard仪表盘(MQTT全流程)

从零构建物联网数据可视化&#xff1a;Node-RED与ThingsBoard的实战融合 在智能家居、工业监测等物联网场景中&#xff0c;如何将物理世界的传感器数据转化为直观的可视化图表&#xff1f;本文将手把手带您完成从硬件数据采集到云端展示的完整链路实现。不同于单纯的理论讲解&a…...

Julia 中的 One Billion Row Challenge

原文&#xff1a;towardsdatascience.com/the-one-billion-row-challenge-in-julia-bdd19cde58d5?sourcecollection_archive---------9-----------------------#2024-06-05 如果数据科学家决定接受这个任务&#xff0c;他们能学到什么&#xff1f; https://medium.com/vikas.…...