牛客剑指offer刷题排序篇

文章目录

      • 数组中重复的数字
        • 题目
        • 思路
        • 代码实现
        • 中等难度
        • 思路
        • 代码实现
      • 数组中的逆序对
        • 题目
        • 思路
        • 代码实现
      • 最小K个数
        • 思路
        • 代码实现
      • 数据流中的中位数
        • 题目
        • 思路
        • 代码实现

数组中重复的数字

题目

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1;

思路

使用HashSet的性质进行判断处理即可;

代码实现
public int duplicate (int[] numbers) {if(numbers == null ||  numbers.length == 0){return -1;}HashSet<Integer> hashSet = new HashSet<>();for(int num:numbers){if(hashSet.contains(num)){return num;}else{hashSet.add(num);}}return -1;}
中等难度

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
LeetCode链接

思路

由于nums数组中的数字范围为[1-n],则我们可以将对应数字放在其对应下标位置[0~n-1],这样如果存在数字重复,则一定会有num[i]-1!=index存在,这样就可以找出重复数字。

代码实现
 public List<Integer> findDuplicates(int[] nums) {List<Integer> result = new ArrayList();for(int i = 0; i < nums.length;i++){while(nums[i] != nums[nums[i]-1]){swap(i,nums[i]-1,nums);}}for(int i = 0; i < nums.length;i++){if(nums[i] - 1 !=i){result.add(nums[i]);}}return result;}private void swap(int i,int j, int[] nums){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}

数组中的逆序对

题目

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007
牛客题目链接

思路

采用归并排序思想解决;

代码实现
 private int result;/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型一维数组 * @return int整型*/public int InversePairs (int[] nums) {if(nums == null || nums.length == 0){return 0;}mergeSort(nums,0,nums.length-1);return result ;}private void mergeSort(int[] nums,int l,int r){int mid = l + (r - l) /2;if(l < r){mergeSort(nums,l,mid);mergeSort(nums,mid+1,r);merge(nums,l,mid,r);}}private void merge(int[] nums,int l,int mid,int r){int[] help = new int[r-l+1];int i = 0;int p1 = l;int p2 = mid +1 ;while(p1 <= mid && p2 <=r){if(nums[p1] <= nums[p2]){help[i++] = nums[p1++];}else {result+=mid - p1+1;result%= 1000000007;help[i++] = nums[p2++];}}while(p1 <= mid){help[i++] = nums[p1++];}while(p2 <= r){help[i++] = nums[p2++];}for(int j =0;j <help.length;j++){nums[l+j] = help[j];}}

最小K个数

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
LeetCode链接

思路
  • 方法1:
    对数组整体进行排序,然后取前k个数;这种方式比较简单,就不再过多赘述,对应时间复杂度为O(nlogn);
  • 方法2:
  1. 定义大根堆,Java中对应的就是优先级队列;
  2. 将数组中前k个数丢入大根堆中;
  3. 然后遍历[k,arr.length-1]位置数据,每次与大根堆堆顶元素(即队列中最大数)进行比较,如果比最大数小,则堆顶元素出队,新的元素入队,最终会产生新的最小元素,对应时间复杂度为O(nlogk);
代码实现

这里采用大根堆的思路来解决问题;

 public int[] smallestK(int[] arr, int k) {if(arr == null || arr.length <  k){return new int[0];}if(k == 0){return new int[0];}PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});int[] result = new int[k];for(int i = 0 ; i< k ; i++){queue.offer(arr[i]);}for(int i = k ; i < arr.length;i++){int peek =  queue.peek();if(arr[i] < peek){queue.poll();queue.offer(arr[i]);}}int j = 0;while(!queue.isEmpty()){int num =  queue.poll();result[j++] = num;}return result;}

数据流中的中位数

题目

中位数 是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5
设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
LeetCode链接

思路
  1. 定义一个大顶堆和小顶堆;
  2. 当大顶堆没有元素时,先放入大顶堆中,如果添加的元素小于等于大顶堆堆顶元素,直接放入大顶堆中,否则放入小顶堆中,保证大顶堆中都是较小的一半元素,小顶堆中是较大的一半元素;
  3. 同时当两个堆中元素数量相差为2时,将元素多的堆顶元素放入元素少的堆中,保证两个堆元素数之差在1以内;
  4. 此时,取中位数即两种情况:
    a. 两个堆中元素数量相等,直接取堆顶元素相加 /2;
    b.两个堆中元素数量不相等,则中位数为数量多的堆顶元素;
    更多详细思路可参考:Java 贪心算法经典问题解决
代码实现
	//Java优先级队列 默认小顶堆private PriorityQueue<Integer> minQueue = new PriorityQueue();// 定义大顶堆private PriorityQueue<Integer> maxQueue = new PriorityQueue<>((x,y) -> (y-x));public MedianFinder() {}//加入元素时public void addNum(int num) {if(maxQueue.size() == 0){maxQueue.offer(num);} else {int peekNum = maxQueue.peek();if(peekNum >= num){maxQueue.offer(num);}else{minQueue.offer(num);}changeQueueSize();}}public double findMedian() {int maxSize = maxQueue.size();if(maxSize == 0){return 0;}int minSize = minQueue.size();if(minSize == maxSize){return (maxQueue.peek() + minQueue.peek()) / 2.0;}double result = maxSize > minSize ? maxQueue.peek(): minQueue.peek();return result;}private void changeQueueSize(){int maxSize = maxQueue.size();int minSize = minQueue.size();if(maxSize - minSize == 2){minQueue.offer(maxQueue.poll());}if(minSize - maxSize  == 2){maxQueue.offer(minQueue.poll());}}

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

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

相关文章

UniApp项目中 使用微信小程序原生语言 进行开发

看效果 wxcomponents 下放的是微信小程序原生代码写的组件。我进行了封装 上干货 在你下uniApp 项目的根目录创建一个 wxcomponents 名字千万不要错 京东、支付宝灯参考下面图片 官方文档也有介绍 然后在你需要引入原生功能的页面里面引入你的组件&#xff08;我这里提前已经放…

初识Java 18-2 泛型

目录 构建复杂模型 类型擦除 C中的泛型 迁移的兼容性 类型擦除存在的问题 边界的行为 对类型擦除的补偿 创建类型实例 泛型数组 本笔记参考自&#xff1a; 《On Java 中文版》 构建复杂模型 泛型的一个优点就是&#xff0c;能够简单且安全地创建复杂模型。 【例子&am…

nginx反向代理解决跨域前端实践

需求实现 本地请求百度的一个搜索接口&#xff0c;用nginx代理解决跨域思路&#xff1a;前端和后端都用nginx代理到同一个地址8080&#xff0c;这样访问接口就不存在跨域限制 本地页面 查询一个百度搜索接口&#xff0c;运行在http://localhost:8035 index.js const path …

elment Loading 加载组件动态变更 text 值bug记录

先上效果图: 倒计时4分钟组件方法 // 倒计时 4分钟getSencond() {this.countDown 4分00秒this.interval setInterval(() > {this.maxTime--;let minutes Math.floor(this.maxTime / 60);let seconds Math.floor(this.maxTime % 60);minutes minutes < 10 ? 0 minu…

台式机加独显引发的故事

弄到一块NVIDIA1660显卡&#xff0c;想要加到台式机&#xff0c;枯树逢春&#xff1b;中间引发不少事情&#xff0c;记录下来共勉 1.台式机插入显卡 1&#xff09;拆开主机后部的接口片 2&#xff09;显卡插入显卡巢&#xff0c;很内存条结构类似&#xff08;长短布局&#xff…

python:range函数的使用

python&#xff1a;range函数的使用 文章目录 python&#xff1a;range函数的使用range的定义参数使用形式作用总结 range的定义 首先让我们看看range函数的帮助信息&#xff0c;通过help来查看 class range(object)| range(stop) -> range object| range(start, stop[,…

代码日常规范

1、编写代码的七大原则 其实在日常生活中的代码只要贯彻这七大原则&#xff0c;然后在这基础上提高编译执行的效率就好 1.1 可读性 可读性是编写代码的关键&#xff0c;它可以让代码更容易理解&#xff0c;更容易维护和修改。可读性可以通过缩进、换行、注释和提示信息等方式…

电子学会C/C++编程等级考试2022年06月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

React 之 airbnb - 项目实战

一、开发前言 1. 规范 2. 创建项目 node -v > 18.0.0 npm -v > 8.6.0 create-react-app star-airbnb 3. 项目基本配置 配置jsconfig.json {"compilerOptions": {"target": "es5","module": "esnext","ba…

kafka2.x常用命令:创建topic,查看topic列表、分区、副本详情,删除topic,测试topic发送与消费

原创/朱季谦 接触kafka开发已经两年多&#xff0c;也看过关于kafka的一些书&#xff0c;但一直没有怎么对它做总结&#xff0c;借着最近正好在看《Apache Kafka实战》一书&#xff0c;同时自己又搭建了三台kafka服务器&#xff0c;正好可以做一些总结记录。 本文主要是记录如…

Spring --- 创建一个Spring项目

文章目录 创建一个Maven项目添加Spring框架支持添加启动类 创建一个Maven项目 注&#xff1a;我们需要使用 Maven 来管理依赖&#xff0c;所以需要创建一个Maven项目 添加Spring框架支持 注&#xff1a; 添加这两个依赖才能正确使用 Spring在添加依赖后记得刷新&#xff0c;把依…

windows安装 evo

1、widows先下载安装python 下载 &#xff0c;安装&#xff0c;设置系统环境变量 2、windows下安装pip 下载 &#xff0c;安装&#xff0c;设置系统环境变量 3、安装evo 二进制安装

【Nginx篇】Nginx轻松上手

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【运维】nginx中root和alias区别和作用是啥

文章目录 前言1、root指令2、alias指令总结&#xff1a; 前言 nginx指定文件路径有两种方式root和alias&#xff0c;这两者的用法区别&#xff0c;使用方法总结了下&#xff0c;方便大家在应用过程中&#xff0c;快速响应。root与alias主要区别在于nginx如何解释location后面的…

Unity2D-URP基于ShaderGraph创建带粒子特效的激光光束

文章目录 创建Shader新建Node: UV新建Node: Split......参数说明 基于Shader创建Material创建Line创建粒子系统StartVFX创建粒子材质更改粒子系统的材质设置透明模式设置粒子效果创建一个Beam设置EndVFX效果预览激光光束管理脚本最终预览 创建Shader Create --> Shader Gra…

零信任、SASE还在因不标准的身份系统难对接而无法发挥真正力量?这份标准化的解决方案助您一臂之力

身份安全是网络安全的一个重要领域&#xff0c;旨在确保用户的身份安全可信&#xff0c;防止未经授权的访问和数据泄漏等问题。目前主流的信息安全趋势强调可持续验证、多源信任评估、动态防护、可持续数据防护、一体化安全审计等&#xff0c;特别是零信任、SASE等技术均以身份…

macOS/Ubuntu - ftp 工具

文章目录 Ubuntu - FilezillamacOS - Termius Ubuntu - Filezilla 安装 sudo apt-get install filezilla查看版本 filezilla --version启动 filezilla你也可以下载安装包&#xff1a; https://filezilla-project.org/download.php 解压 FileZilla_3.66.1_x86_64-linux-gnu…

vue elementUI 自定义框组织树,选择select下拉组织树横行滑动条出现方法

背景&#xff1a;最近公司开发需要使用到组织树进行组织结构的选择&#xff0c;在开发途中遇到两个次组织树已超过外框&#xff0c;但超出部分不显示横向滑动条。 自定义组织树框代码如下&#xff1a; <el-row><el-col :span"20" style"padding: 0px…

《数据结构、算法与应用C++语言描述》-线索二叉树的定义与C++实现

_23Threaded BinaryTree 可编译运行代码见&#xff1a;GIithub::Data-Structures-Algorithms-and-Applications/_24Threaded_BinaryTree 线索二叉树定义 在普通二叉树中&#xff0c;有很多nullptr指针被浪费了&#xff0c;可以将其利用起来。 首先我们要来看看这空指针有多少…

Leetcode刷题之设计循环队列(C语言版)

Leetcode刷题之设计循环队列&#xff08;C语言版&#xff09; 一、题目描述二、题目示例三、题目解析Ⅰ、typedef structⅡ、MyCircularQueue* myCircularQueueCreate(int k)Ⅲ、bool myCircularQueueIsEmpty(MyCircularQueue* obj)Ⅳ、bool myCircularQueueIsFull(MyCircularQ…