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

news2024/12/28 19:59:16

  • 🎥 个人主页: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;
    }

 

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

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

相关文章

Python项目——基于回合制的RPG游戏设计与实现

基于回合制的RPG游戏设计与实现 项目概述 《魔法冒险》是一款基于回合制战斗的角色扮演游戏。玩家将创建一个角色&#xff0c;探索世界&#xff0c;战斗敌人&#xff0c;收集物品并提升等级。 项目设计报告 一、引言 本项目的目标是实现一个基于回合制战斗的 RPG 游戏&…

冯喜运:5.15黄金原油晚盘分析:鲍威尔再放鹰,降息悬念重重

【黄金消息面分析】&#xff1a;在全球经济动荡和通胀预期不断上升的背景下&#xff0c;黄金作为传统的避险资产&#xff0c;再次成为投资者关注的焦点。当前&#xff0c;黄金价格交投于2370美元/盎司左右&#xff0c;连续两日日线呈现上涨趋势&#xff0c;而白银价格也在连续三…

CRWU凯斯西储大学轴承数据,12k频率,十分类

CRWU凯斯西储大学轴承数据&#xff0c;12k频率&#xff0c;十分类。 from torch.utils.data import Dataset, DataLoader from scipy.io import loadmat import numpy as np import os from sklearn import preprocessing # 0-1编码 from sklearn.model_selection import Str…

量化交易:日内回转交易策略

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 引言 本文将介绍日内回转交易策略的原理&#xff0c;并通过Python代码示例展示如何在掘金平台实现该策略。本文将深入探讨一种基于1分钟MACD&#xff08;Moving Average Convergence Divergence&#xff0c;即移动平…

C++ LeetCode 刷题经验、技巧及踩坑记录【三】

C LeetCode 刷题经验、技巧及踩坑记录【三】 前言vector 计数vector 逆序vector 删除首位元素vector二维数组排序vector二维数组初始化C 不同进制输出C 位运算C lower_bound()C pairC stack 和 queue 前言 记录一些小技巧以及平时不熟悉的知识。 vector 计数 计数 //记录与首…

C# Winform+Halcon结合标准视觉工具

介绍 winform与halcon结合标准化工具实例 软件架构 软件架构说明 基于NET6 WINFORMHALCON 实现标准化视觉检测工具 集成相机通讯 集成PLC通讯 TCP等常见通讯 支持常见halcon算子 图形采集blob分析高精度匹配颜色提取找几何体二维码提取OCR识别等等 。。。 安装教程 …

MQTT_客户端安装_1.4

下载地址 MQTTX 下载 下一步直接安装即可 界面介绍

GhostNetV2 Enhance Cheap Operation with Long-Range Attention 论文学习

论文地址&#xff1a;https://arxiv.org/abs/2211.12905 代码地址&#xff1a;https://github.com/huawei-noah/Efficient-AI-Backbones/tree/master/ghostnetv2_pytorch 解决了什么问题&#xff1f; 在计算机视觉领域&#xff0c;深度神经网络在诸多任务上扮演着重要角色。为…

从源头到洞察:大数据时代的数据提取与分析实战指南

随着科技的飞速发展&#xff0c;大数据已经成为现代社会的核心驱动力之一。从商业决策到科学研究&#xff0c;从政策制定到个人生活&#xff0c;数据无处不在&#xff0c;影响着我们的每一个决策。然而&#xff0c;如何从海量的数据中提取有价值的信息&#xff0c;并转化为深刻…

LVM - Linux磁盘逻辑卷管理器概念讲解、实践及所遇到的问题

1、lvm概念 逻辑卷管理器(LogicalVolumeManager)本质上是一个虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次,它可以将几块磁盘(物理卷,PhysicalVolume)组合起来形成一个存储池或者卷组(VolumeGroup)。LVM可以每次从卷组中划分出不同大小的逻辑卷(Logi…

iOS 主要语言切换问题

前言 上架时需要把主要语言切换成英文&#xff0c;存储时一直提示“因为您必须先为使用这种语言的每个版本提供所有必需的截屏”错误。 错误截图 解决方案&#xff1a; 1、增加英文的截图去审核&#xff0c;审核过了再切换主要语言 官方文档出处 END.

uniapp小程序使用scroll-view组件实现上下左右滚动触发事件

在做uniapp开发小程序的时候&#xff0c;有一个需求是在一个表格区域里面可以上下左右滑动元素&#xff0c;并实现表头和左侧的标签联动效果&#xff0c;就想趣运动里面选择场地的效果一样&#xff0c;这里就用到了scroll-view组件&#xff0c;scroll-view官网文档地址&#xf…

安卓、iOS、iPad三端搞定,不再剧荒!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 之前给大家推荐过各种看剧姿势&#xff0c;但很多苹果、平板端的小伙伴还是存在更好的需求体验&#xff0c;今天给大家推荐这款可以在安卓、iOS和平板上都能安装使用&#xff0c;不再剧…

音视频捕捉技术:LCC382 SDI采集卡深度解析

在日新月异的多媒体时代&#xff0c;高质量的音视频采集已成为众多领域不可或缺的一环。为此&#xff0c;灵卡科技精心打造了LCC382 —— 一款集高效性、灵活性与前沿技术于一身的SDI输入与环出、HDMI输出音视频采集卡&#xff0c;旨在满足从专业直播、视频会议到医疗影像、安防…

F5 Big-IP的一些查看命令

1 查看主机名&#xff0c;序列号&#xff0c;版本号 system —>configuration—>Device

Linux系统中pts和tty会话删除

一、背景 一台CentOS6.7主机存在iscsi盘&#xff0c;为了正常卸载此iscsi盘&#xff0c;需要先将所有相关会话退出使用该iscsi盘。 检查发现存在多个系统用户登录的情况。 二、问题 无法使用kill -9删除linux会话&#xff0c;提示信息为“-bash: kill: (16680) - Operation not…

开发利器 - docker 安装运行 mysql

本文选择安装的mysql版本为5.7 &#xff0c;安装环境 mac 1、查看镜像是否存在 docker search mysql:5.7 2、拉取镜像 docker pull mysql:5.7 3、运行镜像 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot1234 -d mysql:5.7 --name&#xff1a;指定容器…

[AI]-(第1期):OpenAI-API调用

文章目录 一、OpenAI API中使用GPT-3.5-turbo模型充值方式使用模型计费方式价格说明相关限制和条款 二、接入一个OpenAI API流程1. 获取OpenAI API 密钥2. 集成ChatGPT到小程序3. 处理用户输入4. 调用OpenAI API5. 返回回复至小程序6. 持续优化7. Postman请求示例 三、通用AI客…

2024最新洗地机推荐,洗地机怎么选?热门品牌哪个最好用?

在现代生活中&#xff0c;忙碌的日常让家庭清洁变得更加繁重和耗时。然而&#xff0c;洗地机的引入彻底改变了这一状况。凭借其强大的清洁效果和简便的使用方式&#xff0c;洗地机能够迅速清除地面上的各种污垢&#xff0c;使清洁工作变得轻松自如。正因为如此&#xff0c;洗地…

windows编译opencv4.9

opencv很多人在windows上编译感觉特别麻烦&#xff0c;没有linux下方便&#xff0c;设定以下三点&#xff0c;我们几乎会无障碍。 1 安装cuda&#xff0c;cudnn 安装好cuda&#xff0c;cudnn&#xff0c;把cudnn的头文件&#xff0c;库等等拷贝到cuda的安装目录下面&#xff…