【专项刷题】— 快排

news2024/12/26 21:42:24

1、颜色分类 - 力扣(LeetCode)

思路:

  1. 创建三个指针,然后把数组分为三个区域
  2. 遍历
  3. 代码:
    class Solution {
        public void swap(int[] nums, int i, int j){
            int t = nums[i];
            nums[i] = nums[j];
            nums[j] = t;
        }
        public void sortColors(int[] nums) {
            int left = -1;
            int right = nums.length;
            int i = 0;
            while(i < right){
                if(nums[i] == 0){
                    swap(nums, ++left, i++);
                }else if(nums[i] == 1){
                    i++;
                }else{
                    swap(nums, --right, i);
                }
            }
        }
    }

2、 排序数组 - 力扣(LeetCode)

思路:

  1. 题1的解法,只需优化一下,随机生成被比较的值即可
  2. 代码:
    class Solution {
        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;
            int i = l;
            int 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);
                }
            }
            qsort(nums, l, left);
            qsort(nums, right, r);
        }
        public void swap(int[] nums, int l,int r){
            int tmp = nums[l];
            nums[l] = nums[r];
            nums[r] = tmp;
        }
    }

 3、数组中的第K个最大元素 - 力扣(LeetCode)

思路:

  1. 在快排的基础上寻找这个第k大的数
  2. 把每个区间的元素的个数标出来,然后:
  3. 代码:
    class Solution {
        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];
            }
    
            //选择一个基准
            int key = nums[new Random().nextInt(r-l+1)+l];
            //根据基准将数组分为三个部分
            int left = l - 1;
            int right = r + 1;
            int i = l;
            while(i < right){
                if(nums[i] < key){
                    swap(nums, ++left, i++);
                }else if(nums[i] == key){
                    i++;
                }else{
                    swap(nums, --right, i);
                }
            }
            //分类讨论a:[l,left] b:[left+1,right-1] c:[right,r]
            int b = right - left - 1;
            int 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 - b- c);
            }
        }
        public void swap(int[] nums, int l, int r){
            int tmp = nums[l];
            nums[l] = nums[r];
            nums[r] = tmp;
        }
    }

4、最小K个数 - 力扣(LeetCode) 

思路:

  1. 与上一题的思路一样只不过是在分类讨论的时候改变一下
  2. 代码:
    class Solution {
        public int[] smallestK(int[] nums, int k) {
            qsort(nums, 0, nums.length - 1, k);
            int[] ret = new int[k];
            for(int i = 0; i < k; i++){
                ret[i] = nums[i];
            }
            return ret;
        }
    
        public void qsort(int[] nums, int l, int r, int k){
            if(l >= r){
                return;
            }
            //随机生成基准
            int key = nums[new Random().nextInt(r-l+1)+l];
            //
            int left = l-1;
            int right = r+1;
            int i = l;
            while(i < right){
                if(nums[i] < key){
                    swap(nums, ++left, i++);
                }else if(nums[i] == key){
                    i++;
                }else{
                    swap(nums, --right, i);
                }
            }
            //分类讨论
            int a = left - l +1;
            int 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 l, int r){
            int tmp = nums[l];
            nums[l] = nums[r];
            nums[r] = tmp;
        }
    }

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

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

相关文章

如何快速开发一个简单的企业信息系统?O2OA手把手带你,高效开发!(附源码)

前言 想象一下&#xff0c;如果你的企业能够通过一个系统快速发布企业信息&#xff0c;员工们无论身在何处都能即时获取新信息&#xff0c;那该多好&#xff01;告别email轰炸和口头传达的低效&#xff0c;O2OA企业应用开发平台让这一切变得简单。 今天&#xff0c;就让我们一…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 二进制游戏(200分)- 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

CCF-Csp算法能力认证, 202312-2因子化简含解析

CCF-Csp算法能力认证&#xff0c; 202312-1仓库规划含解析 前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?…

Java(九)——抽象类、抽象方法

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

Synchronized升级到重量级锁会发生什么?

我们从网上看到很多&#xff0c;升级到重量锁的时候不会降级&#xff0c;再来线程都是重量级锁 今天我们来实验一把真的是这样的吗 1.首选导入Java对象内存布局的工具库&#xff1a; <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-…

django-vue-admin项目运行

文本主要对django-vue-admin项目进行了简要介绍&#xff0c;并且对前后端进行了源码安装和运行。在此基础上可作为管理系统二次开发的基础框架。 一.django-vue-admin简介和安装 1.简介 django-vue-admin项目是基于RBAC模型权限控制的中小型应用的基础开发平台&#xff0c;采…

hung 之 Android llkd

目录 1. llkd 简介 2. 原理 2.1 内核活锁 2.2 检测机制 2.3 为什么 persistent stack signature 检测机制不执行 ABA 检查&#xff1f; 2.4 为什么 kill 进程后&#xff0c;进程还存在就能判定发生了内核 live-lock&#xff1f; 3. 代码 3.1 内核 live-lock 检查 3.2 …

轨道交通全国产工控机:基于飞腾E2000Q的实现AFC系统控制器

AFC系统 提供基于Intel平台、NXP平台、Rockchip平台的核心板、 PICO-ITX板、3.5寸板、Mini-ITX主板以及嵌入式准系统等计算机硬件。产品具有出色的数据传输与处理能力&#xff0c;板载内存&#xff0c;CPU集成图形控制&#xff0c;提供丰富串口、USB、LAN、PCIe扩展接口等I/O接…

学会这个技巧,你的电子画册将秒变专业

在这个数字化的时代&#xff0c;电子画册已经成为展示个人和商业作品的重要方式。然而&#xff0c;许多人虽然拥有出色的内容&#xff0c;却因为缺乏一定的技巧&#xff0c;使得电子画册显得平凡无奇。学会这个技巧&#xff0c;你的电子画册将秒变专业&#xff0c;让你的作品在…

Docker容器下安装Matlab,无需挂载

Matlab的安装需要这些文件 传入ubuntu后&#xff0c;改过相关的文件权限后&#xff0c;发现还是无法挂载 这有可能是docker的安全管理策略导致容器不能挂载&#xff0c;因此采用不挂载形式&#xff0c;直接解压的方式安装Matlab 1.将iso改成zip&#xff0c;并解压 2.解压rar文件…

【深入C++】二叉搜索树

文章目录 什么是二叉搜索树二叉搜索树的接口1.查找操作2.插入操作3.中序遍历4.删除操作 所有代码总结 什么是二叉搜索树 二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;是一种特殊的二叉树&#xff0c;其每个节点最多有两个子节点&#xff0c;分别称为左子节点和…

MySQL 数据库 day 7.16

ok了家人们今天继续记录一下数据库,看看今天学了什么。 一.事物概述 1.1 环境准备 -- 账户表 create table account( id int primary key auto_increment, name varchar(20), money double );insert into account values (null,张三,1000); insert into account values (n…

Matlab Git管理

目录 1、Git配置 1.1 下载 1.2 注册账户 1.3 录入信息 2、matlab配置 2.1 测试git 2.2 创建git 1、Git配置 1.1 下载 使用镜像网站&#xff0c;选择合适的版本download git&#xff0c;一直点next&#xff0c;最后install。 CNPM Binaries Mirror (npmmirror.co…

区块链技术在智能家居中的创新应用探索

随着物联网技术的发展和智能家居市场的蓬勃发展&#xff0c;区块链技术作为一种去中心化的数据管理和安全保障技术&#xff0c;正在逐渐引入智能家居领域&#xff0c;并为其带来了新的创新应用。本文将探讨区块链技术在智能家居中的具体应用场景、优势以及未来发展方向。 智能家…

[MMU]现代计算机内存管理

现代计算机内存管理 内存管理 内存分配与回收 逻辑上对内存空间进行扩充 覆盖技术程序内存区域分为一个固定区和若干个覆盖区 将程序分为多个段&#xff0c;常用的段常驻内存放在固定区、不常用的在需要的时候调入覆盖区 必须由程序员声明覆盖结构 交换技术 虚拟内存 逻辑地址…

《JavaSE》------20.语法实践项目【图书管理系统】

目录 前言 一、图书管理系统成果展示 1.1 管理员&#xff1a; 1.2 普通用户&#xff1a; 二、 图书管理系统框架的搭建 2.1 book包 2.1.2 BookList类 2.2 operation包 2.2.0 IOperation接口 2.2.1 AddOperatoon类 2.2.2 FindOperation类 2.2.3 DelOperation类 2.2…

昇思MindSpore 应用学习-Vision Transformer图像分类

昇思MindSpore 应用学习-Vision Transformer图像分类(AI 代码解析) Vision Transformer图像分类 Vision Transformer&#xff08;ViT&#xff09;简介 近些年&#xff0c;随着基于自注意&#xff08;Self-Attention&#xff09;结构的模型的发展&#xff0c;特别是Transform…

渗透测试靶机---Kioptrix5

渗透测试靶机—Kioptrix5 启动靶机&#xff0c;扫描ip&#xff0c;平平无奇 扫描 惯例&#xff0c;访问80&#xff0c;先看看 好像是没什么内容&#xff0c;查看页面源代码 搜素这个页面的框架&#xff1a; 直接拉下来查看就行 这里存在一个路径穿越 这里就暴露出来了更…

单片机原理及技术(五)—— 单片机与开关、键盘以及显示器件的接口设计(C51编程)

目录 一、单片机控制发光二极管显示 1.1 单片机与发光二极管的连接 1.2 拉电流和灌电流 1.3 I/O端口的编程控制 二、开关状态检测 2.1 开关控制单个LED灯亮灭 三、单片机控制LED数码管的显示 3.1 LED数码管的显示原理 3.2 LED数码管的静态显示与动态显示 3.2.1 静态显…

用不同的url头利用Python访问一个网站,把返回的东西保存为txt文件

这个需要调用requests模块&#xff08;相当于c的头文件&#xff09; import requests 还需要一个User-Agent头&#xff08;这个意思就是告诉python用的什么系统和浏览器&#xff09; Google Chrome&#xff08;Windows&#xff09;: Mozilla/5.0 (Windows NT 10.0; Win64; x64…