算法8--归并

目录

  • 原理
  • 经典例题
    • [912. 排序数组](https://leetcode.cn/problems/sort-an-array/description/)
    • [LCR 170. 交易逆序对的总数](https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/description/)
    • 计算右侧小于当前元素的个数
    • [493. 翻转对](https://leetcode.cn/problems/reverse-pairs/description/)

原理

归并算法的原理可以参考归并排序,归并排序算法不仅仅是使用该算法对数据进行排序,重要的是在归并的过程中解决某些问题,从而使一些原本时间复杂度较高的问题降到O(n*log2n)。

经典例题

912. 排序数组

给你一个整数数组 nums,请你将该数组升序排列。
你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

这里可以使用归并排序解决:

class Solution {
public:void MySort(vector<int>& nums,int left,int right){if(left>=right){return;}int mid=(left+right)/2;MySort(nums,left,mid);MySort(nums,mid+1,right);int pos1=left;int pos2=mid+1;int end1=mid;int end2=right;vector<int> tmp;while(pos1<=end1&&pos2<=end2){if(nums[pos1]<nums[pos2]){tmp.push_back(nums[pos1]);++pos1;}else if(nums[pos1]>nums[pos2]){tmp.push_back(nums[pos2]);++pos2;}else{tmp.push_back(nums[pos1]);tmp.push_back(nums[pos2]);++pos1;++pos2;}}while(pos1<=end1){tmp.push_back(nums[pos1]);++pos1;}while(pos2<=end2){tmp.push_back(nums[pos2]);++pos2;}int i=left;for(auto e:tmp){nums[i++]=e;}}vector<int> sortArray(vector<int>& nums) {if(0==nums.size()){return nums;}MySort(nums,0,(int)nums.size()-1);return nums;}
};

LCR 170. 交易逆序对的总数

在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。

排降序,归并过程中计算逆序对

class Solution {
public:int GetAnswer(vector<int>& record,int left,int right){if(left>=right){return 0;}int mid=(left+right)/2;int count=GetAnswer(record,left,mid)+GetAnswer(record,mid+1,right);int pos1=left;int pos2=mid+1;int end1=mid;int end2=right;vector<int> tmp;while(pos1<=end1&&pos2<=end2){if(record[pos1]<record[pos2]){tmp.push_back(record[pos2++]);}else if(record[pos1]>record[pos2]){tmp.push_back(record[pos1++]);count+=end2-pos2+1;}else{tmp.push_back(record[pos2++]);}}while(pos1<=end1){tmp.push_back(record[pos1++]);}while(pos2<=end2){tmp.push_back(record[pos2++]);}for(auto e:tmp){record[left++]=e;}return count;}int reversePairs(vector<int>& record) {if(0==record.size()){return 0;}return GetAnswer(record,0,record.size()-1);}
};

计算右侧小于当前元素的个数

给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

只需每个元素都绑定好数组下标,再进行归并排序即可,同时为了避免数组的开辟释放,可以提前开好足够的数组空间直接在该数组上操作即可,从而得到一定的优化。

class Solution {
public:void GetAnswer(vector<vector<int>>&nums,int left,int right){if(left>=right){return;}int mid=(left+right)/2;GetAnswer(nums,left,mid);GetAnswer(nums,mid+1,right);if(nums[left][0]==nums[mid][0]&&nums[mid][0]==nums[mid+1][0]&&nums[mid+1][0]==nums[right][0]){return;}int pos1=left;int pos2=mid+1;int end1=mid;int end2=right;vector<vector<int>> tmp;tmp.reserve(right-left+1);while(pos1<=end1&&pos2<=end2){if(nums[pos1][0]<nums[pos2][0]){tmp.push_back(nums[pos2++]);}else if(nums[pos1][0]>nums[pos2][0]){nums[pos1][1]+=end2-pos2+1;tmp.push_back(nums[pos1++]);}else{tmp.push_back(nums[pos2++]);}}while(pos1<=end1){tmp.push_back(nums[pos1++]);}for(auto& e:tmp){nums[left++]=e;}}vector<int> countSmaller(vector<int>& nums) {vector<vector<int>> tmp(nums.size(),vector<int>(3,0));int i=0;for(;i<nums.size();++i){tmp[i][0]=nums[i];tmp[i][2]=i;}GetAnswer(tmp,0,nums.size()-1);vector<int> ans(nums.size(),0);for(auto &e:tmp){ans[e[2]]=e[1];}return ans;}
};

493. 翻转对

给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。

排降序归并
解法一:归并过程中,如果:

  • nums [left]>2*nums[right]:left移入tmp1中,计算翻转对,++left
  • nums[right] <= nums [left] <= 2*nums[right]:right移入tmp2中,++right
  • nums [left] < nums[right]:right移入tmp1中,++right

解法二:
对左右两个部分,先计算完所有翻转对,再合并

class Solution {
public:int GetAnswer(vector<int>& record, int left, int right) {if (left >= right) {return 0;}int mid = (left + right) / 2;int count = GetAnswer(record, left, mid) + GetAnswer(record, mid + 1, right);int pos1 = left;int pos2 = mid + 1;int end1 = mid;int end2 = right;vector<int> tmp1;vector<int> tmp2;while (pos1 <= end1 && pos2 <= end2) {if (record[pos1] < record[pos2]) {if((long long int)record[pos1] >2* (long long int)record[pos2]){count += end2 - pos2 + 1;tmp2.push_back(record[pos1++]);}else{tmp1.push_back(record[pos2++]);}}else {if((long long int)record[pos1] >2* (long long int)record[pos2]){count += end2 - pos2 + 1;tmp1.push_back(record[pos1++]);}else{tmp2.push_back(record[pos2++]);}}}while (pos1 <= end1) {tmp1.push_back(record[pos1++]);}while (pos2 <= end2) {tmp1.push_back(record[pos2++]);}vector<int> tmp;for(pos1=0,pos2=0;pos1<tmp1.size()&&pos2<tmp2.size();){if(tmp1[pos1]>tmp2[pos2]){tmp.push_back(tmp1[pos1++]);}else if(tmp1[pos1]<tmp2[pos2]){tmp.push_back(tmp2[pos2++]);}else{tmp.push_back(tmp1[pos1++]);tmp.push_back(tmp2[pos2++]);}}while(pos1<tmp1.size()){tmp.push_back(tmp1[pos1++]);}while(pos2<tmp2.size()){tmp.push_back(tmp2[pos2++]);}for (auto e : tmp) {record[left++] = e;}return count;}int reversePairs(vector<int>& nums) {return GetAnswer(nums,0,nums.size()-1);}
};

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

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

相关文章

深度学习查漏补缺:1.梯度消失、梯度爆炸和残差块

一、梯度消失 梯度消失的根本原因在于 激活函数的性质和链式法则的计算&#xff1a; 激活函数的导数很小&#xff1a; 常见的激活函数&#xff08;例如 Sigmoid 和 Tanh&#xff09;在输入较大或较小时&#xff0c;输出趋于饱和&#xff08;Sigmoid 的输出趋于 0 或 1&#xf…

c++可变参数详解

目录 引言 库的基本功能 va_start 宏: va_arg 宏 va_end 宏 va_copy 宏 使用 处理可变参数代码 C11可变参数模板 基本概念 sizeof... 运算符 包扩展 引言 在C编程中&#xff0c;处理不确定数量的参数是一个常见的需求。为了支持这种需求&#xff0c;C标准库提供了 &…

【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】

天气时钟&#xff1a;天气模块开发、主函数编写 I2C协议和SPI协议I2C&#xff08;Inter-Integrated Circuit&#xff09;SPI&#xff08;Serial Peripheral Interface&#xff09; 天气模块心知天气预报使用HTTPClient类介绍主要功能常用函数注意事项 JSON介绍deserializeJson函…

SpringBoot的配置(配置文件、加载顺序、配置原理)

文章目录 SpringBoot的配置(配置文件、加载顺序、配置原理)一、引言二、配置文件1、配置文件的类型1.1、配置文件的使用 2、多环境配置 三、加载顺序四、配置原理五、使用示例1、配置文件2、配置类3、控制器 六、总结 SpringBoot的配置(配置文件、加载顺序、配置原理) 一、引言…

政务行业审计文件大数据高速报送解决方案

随着信息技术的快速发展&#xff0c;电子政务迎来了新的升级浪潮。国家相继出台了一系列信息化发展战略规划&#xff0c;如《国家信息化发展战略纲要》、《“十三五”国家信息化规划》等&#xff0c;这些政策为政务信息化工作指明了方向。 然而&#xff0c;在实际操作中&#x…

GMSL 明星产品之 MAX96724

上一篇文章中&#xff0c;我们介绍了摄像头侧 GMSL 加串器 MAX96717. 今天我们来介绍下 GMSL 解串器明星产品 MAX96724&#xff1a; 可将四路 GMSL™2/1 输入转换为 1 路、2 路或 4 路 MIPI D-PHY 或 C-PHY 输出。该器件支持通过符合 GMSL 通道规范的 50Ω 同轴电缆或 100Ω 屏…

机器学习--概览

一、机器学习基础概念 1. 定义 机器学习&#xff08;Machine Learning, ML&#xff09;&#xff1a;通过算法让计算机从数据中自动学习规律&#xff0c;并利用学习到的模型进行预测或决策&#xff0c;而无需显式编程。 2. 与编程的区别 传统编程机器学习输入&#xff1a;规…

MySQL5.5升级到MySQL5.7

【卸载原来的MySQL】 cmd打开命令提示符窗口&#xff08;管理员身份&#xff09;net stop mysql&#xff08;先停止MySQL服务&#xff09; 3.卸载 切换到原来5.5版本的bin目录&#xff0c;输入mysqld remove卸载服务 测试mysql -V查看Mysql版本还是5.5 查看了环境变量里的…

java SSM框架 商城系统源码(含数据库脚本)

商城购物功能&#xff0c;项目代码&#xff0c;mysql脚本&#xff0c;html等静态资源在压缩包里面 注册界面 登陆界面 商城首页 文件列表 shop/.classpath , 1768 shop/.project , 1440 shop/.settings/.jsdtscope , 639 shop/.settings/org.eclipse.core.resources.prefs , …

【PyTorch】3.张量类型转换

个人主页&#xff1a;Icomi 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&#xff0c;能够处理复杂的数据模式。通过 PyTorch&#xff0…

用 HTML、CSS 和 JavaScript 实现抽奖转盘效果

顺序抽奖 前言 这段代码实现了一个简单的抽奖转盘效果。页面上有一个九宫格布局的抽奖区域&#xff0c;周围八个格子分别放置了不同的奖品名称&#xff0c;中间是一个 “开始抽奖” 的按钮。点击按钮后&#xff0c;抽奖区域的格子会快速滚动&#xff0c;颜色不断变化&#xf…

deepseek的两种本地使用方式

总结来说 ollama是命令行 GPT4ALL桌面程序。 然后ollamaAnythingLLM可以达到桌面或web的两种接入方式。 一. ollama和deepseek-r1-1.5b和AnythingLLM 本文介绍一个桌面版的deepseek的本地部署过程&#xff0c;其中ollama可以部署在远程。 1. https://www.cnblogs.com/janeysj/p…

修复fstab文件引起的系统故障

进入系统救援模式&#xff0c;修复故障 通过光盘启动系统&#xff0c;进入救援模式 点击虚拟机....>电源....>打开电源时进入固件进入BIOS程序 按号把光盘调到最前面&#xff08;优先使用光盘启动&#xff09; 按F10保存退出 重启选择最后一个进行排错 选择第二项 救援c…

深入核心:一步步手撕Tomcat搭建自己的Web服务器

介绍&#xff1a; servlet&#xff1a;处理 http 请求 tomcat&#xff1a;服务器 Servlet servlet 接口&#xff1a; 定义 Servlet 声明周期初始化&#xff1a;init服务&#xff1a;service销毁&#xff1a;destory 继承链&#xff1a; Tomcat Tomcat 和 servlet 原理&#x…

傅里叶分析之掐死教程

https://zhuanlan.zhihu.com/p/19763358 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析 不仅仅是一个数学工具&#xff0c;更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是&#xff0c;傅里叶分析的公式看起来太复杂了&#xff0c;所以很多…

【Linux系统】信号:认识信号 与 信号的产生

信号快速认识 1、生活角度的信号 异步&#xff1a;你是老师正在上课&#xff0c;突然有个电话过来资料到了&#xff0c;你安排小明过去取资料&#xff0c;然后继续上课&#xff0c;则小明取资料这个过程就是异步的 同步&#xff1a;小明取快递&#xff0c;你停下等待小明回来再…

stm32硬件实现与w25qxx通信

使用的型号为stm32f103c8t6与w25q64。 STM32CubeMX配置与引脚衔接 根据stm32f103c8t6引脚手册&#xff0c;采用B12-B15四个引脚与W25Q64连接&#xff0c;实现SPI通信。 W25Q64SCK&#xff08;CLK&#xff09;PB13MOSI&#xff08;DI&#xff09;PB15MISO(DO)PB14CS&#xff08…

22.Word:小张-经费联审核结算单❗【16】

目录 NO1.2 NO3.4​ NO5.6.7 NO8邮件合并 MS搜狗输入法 NO1.2 用ms打开文件&#xff0c;而不是wps❗不然后面都没分布局→页面设置→页面大小→页面方向→上下左右&#xff1a;页边距→页码范围&#xff1a;多页&#xff1a;拼页光标处于→布局→分隔符&#xff1a;分节符…

it基础使用--5---git远程仓库

it基础使用–5—git远程仓库 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念 -git基础使用–3—安装和基本使用 -git基础使用–4—git分支和使用 2. 什么是远程仓库 在第一篇文章中&#xff0c;我们已经讲过了远程仓库&#xff0c;每个本…

aitraderv4.2开发计划,整合QMT。年化39.9%的因子与年化19.3%的策略哪个优?

原创内容第784篇&#xff0c;专注量化投资、个人成长与财富自由。 昨天我们发布的aitrader v4.1的代码&#xff1a;aitrader_v4.1系统更新|含年化39.1%的组合策略代码|backtraderopenctp实盘&#xff08;代码数据&#xff09; 星球下周代码计划&#xff1a; 1、考虑整合back…