快速排序(plus)与单调栈道,力扣912.排序数组​​​​​​​力扣215.数组中的第k大个元素力扣17.14最小的k个数单调栈力扣.柱状图中最大的矩形

 

目录

力扣912.排序数组​​​​​​​

力扣215.数组中的第k大个元素

力扣17.14最小的k个数

单调栈

力扣.柱状图中最大的矩形


力扣912.排序数组

 

快速排序:最重要的就是数据划分,叫做partation

left往后走,假如遇到比key小的,left++是因为,腾出来下一个位置,让i居住,因为假如key是2 nums[i]=1,那么left一定是在key的前一个位置,然后把i和++left换完之后,继续向下遍历

那么假如遇到比key大的情况,需要交换nums[--right]和当前i位置,因为我们只是知道该位置比key大,但是不知道没有遍历的那个元素是大还是小,所以不去动i,其实就是

0-i是已经遍历过的,i-right是没有遍历过的,没有遍历过的需要遍历,遍历过的不动即可。

class Solution {public int[] sortArray(int[] nums) {//传递一个左区间,和一个右边区间qsort(nums,0,nums.length-1);return nums;}public void qsort(int []nums,int l,int r){//0-left  left-i. i-rightif(l>=r)return ;//数组分三块int key=nums[new Random().nextInt(r-l+1)+l];int left=l-1,right=r+1,i=l;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 left,int right){int tmp=nums[right];nums[right]=nums[left];nums[left]=tmp;}
}

力扣215.数组中的第k大个元素

class Solution {public int findKthLargest(int[] nums, int k) {//堆排序//基于快速选择算法,时间复杂度O(N),基于快排return   qsort(nums,0,nums.length-1,k);}public int qsort(int[]nums,int l,int r,int k){if(l==r){//当l==r时候,只有这一个元素,为什么不会l>r的情况//因为查找第几大的时候,不会出现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,i,--right); }
//分类讨论[l,left],[left+1,right-1],[right,r]//我们需要分别计算出b,c长度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 left,int right){int tmp=nums[right];nums[right]=nums[left];nums[left]=tmp;}
}

力扣17.14最小的k个数

class Solution {public int[] smallestK(int[] arr, int k) {
//最小的k个数,是找大根堆sort(arr,0,arr.length-1,k);int[]a=new int[k];for(int i=0;i<k;i++){a[i]=arr[i];}return a;}public void  sort(int []arr,int l,int r,int k){if(l>=r) return ;//先让随机数模区间长度,就是0到n-1int key=arr[new Random().nextInt(r-l+1)+l];int left=l-1;int right=r+1;int i=l;while(i<right){if(key>arr[i]) swap(arr,i++,++left);else if(key==arr[i])i++;else if(key<arr[i]) swap(arr,i,--right);}int a=left-l+1;int b=right-left-1;if(a>k){sort(arr,l,left,k);}else if(a+b>=k){return;}else {sort(arr,right,r,k-a-b);}
}
public void swap(int []nums,int left,int right){int tmp=nums[right];nums[right]=nums[left];nums[left]=tmp;
}}

在上面代码,我之前在想,假如我的key是下标,而不是数字,我后面用数字表示会咋样

int key=new Random().nextInt(r-l+1)+l;int left=l-1;int right=r+1;int i=l;while(i<right){if(arr[key]>arr[i]) swap(arr,i++,++left);else if(arr[key]==arr[i])i++;else if(arr[key]<arr[i]) swap(arr,i,--right);}

我发现他改变了数组,但是也有问题,就是他的key是下标,而不是数字,换句话说他的这个key是一直变化的按照上述写法,而最上面的正确写法是这个数字保持不变,两侧控制。

单调栈

力扣.柱状图中最大的矩形

单调栈使用,存储两边中第一次遇到的最小值,用单调栈来辅助去找左右两边第一次遇到的最小值,

class Solution {public int largestRectangleArea(int[] heights) {  Stack<Integer>stack=new Stack<>();int n=heights.length;int[] left=new int[n];int[] right=new int[n];int count=0;left[0]=-1;stack.add(0);//左边找第一个比她小的for(int i=1;i<n;i++){while(!stack.isEmpty()&&heights[stack.peek()]>=heights[i]){stack.pop();}if(!stack.isEmpty()&&heights[stack.peek()]<heights[i]){left[i]=stack.peek();}else if(stack.isEmpty()){left[i] = -1;}stack.add(i);}stack.clear();right[n-1]=n;stack.add(n-1);//右边找第一个比她小的for(int i=n-2;i>=0;i--){while(!stack.isEmpty()&&heights[stack.peek()]>=heights[i]){right[i]=stack.pop();} if(!stack.isEmpty()&&heights[stack.peek()]<heights[i]){right[i]=stack.peek();}else if(stack.isEmpty()){right[i] = n;}stack.add(i);}for(int i=0;i<n;i++){count=Math.max(count,heights[i]*(right[i]-left[i]-1));}return count;
}
}

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

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

相关文章

解释器模式原理剖析和Spring中的应用

解释器模式原理剖析和Spring中的应用 解释器模式 是一种行为型设计模式&#xff0c;它定义了一种语言的文法表示&#xff0c;并提供了一个解释器来处理该文法的表达式。解释器模式可以用于构建语法解释器&#xff0c;例如计算器、简单编程语言的解释器等。 核心思想&#xff1a…

My_String完善

#include "my_string_ok.h" My_string_Ok::My_string_Ok():size(20) { len 0; ptr new char[size]; ptr[len] \0; } My_string_Ok::My_string_Ok(int num,char c) { cout<<"有参构造"<<endl; ptr new char [20] ; len 0; for…

深度学习技术在超材料科学中的应用与实操

人工智能算法赋能材料设计与应用专题培训 前沿背景 人工智能与材料科学的融合趋势&#xff1a;在材料科学领域&#xff0c;人工智能&#xff08;AI&#xff09;的引入正在引发一场革命。传统的材料设计和优化依赖于经验和试错方法&#xff0c;这不仅耗时且成本高昂。关于AI赋…

安科瑞Acrel-1000DP分布式光伏监控系统在鄂尔多斯市鄂托克旗巴音乌苏六保煤矿5MW分布式光伏项目中的应用

安科瑞 华楠 摘 要&#xff1a;分布式光伏发电就是将太阳能光伏板分散布置在各个区域&#xff0c;通过小规模、模块化的方式实现电能的并网或独立使用&#xff0c;这种发电方式具有就近发电、就近并网、就近转换、就近使用的特点。近年来&#xff0c;技术进步和政策支持推动了光…

Python批量合并365个工作表的2种方法

一、引言 小明刚进入到新公司&#xff0c;就被委以重任&#xff1a;将365个Excel文件中的英文表头修改为中文。传统方法是逐一打开每个文件&#xff0c;手动修改标题&#xff0c;然后保存&#xff0c;最后再合并。这种方法不仅耗时耗力&#xff0c;还容易出错。如果用Python就…

下水道内缺陷识别检测数据集 yolo数据集 共2300张

下水道内缺陷识别检测数据集 yolo数据集 共2300张 下水道内部缺陷识别数据集&#xff08;Sewer Interior Defect Recognition Dataset, SIDRD&#xff09; 摘要 SIDRD 是一个专门针对下水道内部缺陷识别的数据集&#xff0c;旨在为城市基础设施维护和管理提供一个标准化的训练…

Qt:关于16进制数转化那些事

前言 由于当时做UDP通信的时候使用16进制数与QString的相互转换&#xff0c;但是当时我所要求的转换不仅仅是转化过去就行了&#xff0c;我还有字节数要求&#xff0c;就是这个16进制数占据多少位那么转化后的数据就该占据多大的空间。 正文 1 将 QString 转换为16进制字符串…

【Redis入门到精通五】Java如何像使用MySQL一样使用Redis(jedis安装及使用)

目录 Jedis 1.jedis是什么 2.jedis的安装配置 3.jedis的基础命令操作展示 1.set和get操作&#xff1a; 2.exists和del操作&#xff1a; 3.keys和type操作&#xff1a; 4. expire和ttl&#xff1a; Jedis Java 操作 redis 的客⼾端有很多&#xff0c;其中最知名的是 jedi…

STM32基础学习笔记-Timer定时器面试基础题5

第五章、TIMER 常见问题 1、基本概念&#xff1a;什么是定时器 &#xff1f;作用 &#xff1f;分类 &#xff1f; 2、时基单元 &#xff1f;组成 &#xff1f;计数模式 &#xff1f;溢出条件 &#xff1f; 溢出时间计算 &#xff1f; 3、systick原理 &#xff1f;代码讲解 &…

中国蚁剑(antSword)安装使用

antSword下载 antSword-Loader下载 作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/12 19:35 中国蚁剑&#xff08;AntSword&#xff09;是一款跨平台的开源网站管理工具&#xff0c;旨在满足渗透测试人员的需求。它是一个功能强大的工具&#xff0c;可以帮助用户管理…

基于CPS CPSQ5453CPSQ5352的易冲车灯方案

一、方案描述 CPS易冲&#xff08;CONVENIENTPOWER&#xff09;针对汽车矩阵大灯&#xff0c;推出 基于CPS CPSQ5453 & CPSQ5352的汽车矩阵式大灯方案。 开发板搭载的主要器件有CPS的独立双通道恒压恒流升压控制器&#xff1a;CPSQ5453、独立双通道LED恒流降压变换器&#…

心觉:如何重塑高效学习的潜意识(1)两种方法的优缺点

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作180/1000天 你的学习习惯是什么呢 学习的时候是感到轻松吗 很多人感觉现在是知识大爆炸的时代&#xff0c;每天都会产生海量的知…

第 1 章:Vue 核心

1. Vue 简介 1.1. 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/&#xff1a;中文官网里面【教程】和【API】是比较重要的。用到api就去查询&#xff0c;实践当中记忆更牢靠。 风格指南&#xff1a;官方推荐写的一个代码风格cookbook&#xff1a;编写v…

【Python报错已解决】SyntaxError: invalid syntax

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25 1. PromSec: Prompt Optimization for Secure Generation of Functional Source Code with Large Language Models (LLMs) M Nazzal, I Khalil, A Khreishah, NH Phan - arXiv preprint arXiv:2409.12699, 2…

车辆识别数据集,图片数量20500,模型已训练200轮

车辆识别数据集&#xff08;Vehicle Recognition Dataset, VDRD&#xff09; 摘要 VDRD 是一个专为车辆识别设计的大规模数据集&#xff0c;它包含了20500张不同类型的汽车、货车、公交车以及其他类型车辆的图像。数据集提供了四种车辆类别&#xff1a;汽车、货车、其他车辆和…

网页爬虫法律与道德:探索法律边界与道德规范

目录 引言 一、网络爬虫技术概述 1.1 定义与功能 1.2 技术原理 1.3 案例分析 二、网络爬虫的法律边界 2.1 合法性要求 2.2 刑事风险 2.3 案例分析 三、网络爬虫的道德规范 3.1 尊重版权和隐私 3.2 合理使用爬虫技术 3.3 透明度和社会责任 四、技术挑战与应对策略…

支付宝沙箱环境 支付

一 什么是沙箱&#xff1a; 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境 支付宝正式和沙箱环境的区别 &#xff1a; AI&#xff1a; 从沙箱到正式环境&#xff1a; 当应用程序开发完成后&#xff0c;需要将应用程序从沙箱环境迁移到正式环境。 这通常涉及…

RabbitMQ——消息的可靠性处理

1.业务分析 在业务的开发中&#xff0c;我们通常将业务的非核心业务交给MQ来处理&#xff0c;比如支付&#xff0c;在支付过后&#xff0c;我们需要扣减余额&#xff0c;修改支付单状态&#xff0c;修改订单状态&#xff0c;发送短信提醒用户&#xff0c;给用户增加积分等等&am…

C++学习笔记----8、掌握类与对象(一)---- 对象中的动态内存分配(2)

2.2、用析构函数释放内存 每当完成动态分配内存时&#xff0c;都应该释放。如果在一个对象中动态分配内存&#xff0c;释放内存的地方就是析构函数。编译器保证当对象被破坏时会调用析构函数。下面就是Spreadsheet类定义中的析构函数&#xff1a; export class Spreadsheet { …