归并分治问题练习和题解

文章目录

  • 简介
  • 排序数组
    • 原理
    • 代码
  • 交易逆序对的总数
    • 原理
    • 代码跑的过程
    • 代码
  • 计算右侧小于当前元素的个数
    • 原理
    • 代码
  • 翻转对
    • 代码

简介

大家好,这里是jiantaoyab,这篇文章给大家带来的是归并类型相关的题目练习和解析,涉及到递归的题目大家可以画递归展开图来方便理解,后面的题目有点绕,大家耐心想想就能理解,希望大家能相互讨论进步

排序数组

https://leetcode.cn/problems/sort-an-array/

原理

在这里插入图片描述

递归展开图

在这里插入图片描述

代码

class Solution {vector<int> tmp; //辅助数组
public://归并排序void MergeSort(vector<int>& nums, int l, int r){if(l >= r) return;int mid = (r + l) >> 1; //中间点//左右区间排序MergeSort(nums, l, mid);MergeSort(nums, mid+1, r);int cur1 = l, cur2 = mid + 1, i = 0;//合并2个有序数组while(cur1 <= mid && cur2 <= r){tmp[i++] = nums[cur1] >= nums[cur2] ? nums[cur2++] : nums[cur1++];}//处理剩下的元素while(cur1 <= mid) tmp[i++] = nums[cur1++];while(cur2 <= r) tmp[i++] = nums[cur2++];for(int i = l; i <= r; i++){nums[i] = tmp[i - l];}}vector<int> sortArray(vector<int>& nums) {tmp.resize(nums.size());MergeSort(nums, 0, nums.size() - 1);return nums;}
};

交易逆序对的总数

https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof

原理

在这里插入图片描述

代码跑的过程

在这里插入图片描述

代码

class Solution {vector<int> tmp; 
public:int MergeSort(vector<int>& record, int left, int right){if (left >=  right) return 0;// 没有逆序对了int ret = 0; //统计有多少逆序对int mid = (left + right) >> 1 ;//1.先求出左边区间和右边区间有多少逆序对// [left,mid]  [mid+1,right]ret += MergeSort(record, left, mid);ret += MergeSort(record, mid + 1, right);//2.左边区间找一个,右边区间找一个int cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2 <= right){if(record[cur1] <= record[cur2]) tmp[i++] = record[cur1++];else{ret += mid - cur1 + 1;tmp[i++] = record[cur2++];}}while(cur1 <= mid) tmp[i++] = record[cur1++];while(cur2 <= right) tmp[i++] = record[cur2++];for(int j = left; j <= right; j++){record[j] = tmp[j - left];}return ret;}int reversePairs(vector<int>& record) {tmp.resize(record.size());return MergeSort(record, 0, record.size() - 1);}
};

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

https://leetcode.cn/problems/count-of-smaller-numbers-after-self/

原理

用到上一题的降序解法:找出该数之后有多少个比我小,这里创建的index是和nums元素绑定的,要不断的更改,所以给index创建了一个tmp_index

在这里插入图片描述

代码

class Solution {vector<int> index; //nums中元素的下标vector<int> ret; //最终的结果int tmp_nums [1000000]; //nums的辅助数组int tmp_index[1000000]; //index的辅助数组
public:void MergeSort(vector<int>& nums, int left,int right){if( left >= right) return ;int mid = (left + right) >> 1;//左右统计MergeSort(nums, left, mid);MergeSort(nums, mid+1, right);//一左一右统计int cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2 <= right){if(nums[cur1] <= nums[cur2]) {tmp_nums[i] = nums[cur2];tmp_index[i] = index[cur2];i++;cur2++;}else{ret[index[cur1]] += right - cur2 + 1;tmp_nums[i] = nums[cur1];tmp_index[i] = index[cur1];i++;cur1++;}}while(cur1 <= mid){tmp_nums[i] = nums[cur1];tmp_index[i] = index[cur1];i++;cur1++;}while(cur2 <= right){tmp_nums[i] = nums[cur2];tmp_index[i] = index[cur2];i++;cur2++;}for(int j = left; j <= right; j++){nums[j] = tmp_nums[j - left];index[j] = tmp_index[j - left];}}vector<int> countSmaller(vector<int>& nums) {ret.resize(nums.size());index.resize(nums.size());//记录原始数组下标for(int i = 0; i < nums.size(); i++){index[i] = i;}MergeSort(nums, 0 , nums.size() - 1 );return ret;}
};

翻转对

https://leetcode.cn/problems/reverse-pairs/

代码

class Solution {int tmp_nums[50000];
public:int MergeSort(vector<int>& nums, int left, int right){if(left >= right) return 0;int ret = 0;int mid = (right + left) >> 1;ret += MergeSort(nums, left, mid);ret += MergeSort(nums, mid + 1, right);int  cur1 = left, cur2 = mid + 1, i = left;//1.先统计翻转对数量while(cur1 <= mid) //固定cur1{//当cur2的2倍比ur1大的时候,cur2++while(cur2 <= right && nums[cur2] >= nums[cur1] / 2.0) cur2++;if(cur2 > right) break;ret += right -cur2 + 1;cur1++;}//2.再合并数数组cur1 = left, cur2 = mid + 1;while(cur1 <= mid && cur2 <= right){tmp_nums[i++] = nums[cur1] >= nums[cur2] ? nums[cur1++] : nums[cur2++];}//处理剩下的元素while(cur1 <= mid) tmp_nums[i++] = nums[cur1++];while(cur2 <= right) tmp_nums[i++] = nums[cur2++];for(int j = left; j <= right; j++){nums[j] = tmp_nums[j]; //i是从left开始的}return ret;}int reversePairs(vector<int>& nums) {return MergeSort(nums, 0, nums.size()-1);}
};

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

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

相关文章

【C++】用文件流的put和get成员函数读写文件

题目 编写一个mycopy程序&#xff0c;实现文件复制的功能。用法是在控制台输入&#xff1a; mycooy 源文件名 目标文件名 参数介绍 m a i n main main 函数的参数有两个&#xff0c;一个int类型参数和一个指针数组。 a r g c argc argc 表示参数的个数。参数为void时 a r g …

关于uniapp小程序的分包问题

开发uniapp小程序时&#xff0c;在打包上传代码时会出现超出2M的打包限制不能上传&#xff0c;那么我们该怎么做呢&#xff1f; 1.对于图片&#xff0c;将图片从后端服务取&#xff0c;尽量不要放在静态资源&#xff0c;图片体积会影响打包大小。 2.使用分包&#xff0c;tabb…

网络防御第6次作业

防病毒网关 按照传播方式分类 病毒 病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0c;又是下一次感染的出发点。计算机病毒感染的一般过…

Cordova打包手机位置权限没有“始终允许“权限

1 找到AndroidManifest.xml文件 2 增加一行 <uses-permission android:name"android.permission.ACCESS_BACKGROUND_LOCATION" />

Linux--使用 Haproxy搭建Web群集

1、 案例概述 Haproxy是目前比较流行的一种群集调度工具&#xff0c;同类群集调度工具有很多&#xff0c;如LVS 和 Nginx。相比较而言&#xff0c;LVS性能最好&#xff0c;但是搭建相对复杂&#xff1a;Nginx的upstream 模块支持群集功能&#xff0c;但是对群集节点健康检查功能…

Python把excel内容保存为图片(非统计图而是纯原表格数据)

一、引入 excel2img 库&#xff0c;没有的话使用 pip install excel2img进行安装 二、采用如下方法进行图片生成 excel文件名为&#xff1a;111.xlsx excel表格里面的sheet名称列表为 [Sheet1, Sheet2] 最终保存为以sheet名称.png的图片 支持跨表格合并项 import excel2i…

1、docker入门

文章目录 1、tocker简介2、tocker的安装&环境配置2、配置阿里云镜像3、基本命令1、镜像命令2、docker基本命令3、镜像基本命令4、Docker 容器常用命令 1、tocker简介 新一代的虚拟化技术 2、tocker的安装&环境配置 uname -r1、首先查看liunx的内核 yum update -y2、更…

前后端项目-part03

文章目录 5.4.4 机构名称5.4.4.1 创建实体类Company5.4.4.2 创建实体类CompanyMapper5.4.4.3 创建实体类CompanyService5.4.4.4 创建实体类CompanyController5.4.4.5 后端测试5.4.4.6 修改basic.js5.4.4.7 修改course.vue5.4.4.8 测试5.4.5 课程标签5.4.5.1 效果5.4.5.2 修改co…

Redis的应用——接口幂等性,分布式锁,基于注解+拦截器的接口幂等改进

目录 引出接口幂等&分布式锁接口幂等性Redisson框架接口幂等改进 缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Redis的应用——接口幂等性&#xff0c;分布式锁&#xff0c;基于注解拦截器的接口幂等改进 接口幂等&分布式锁 系统…

c++学习记录 deque容器—构造函数

1、deque容器基本概念 1.1 功能 双端数组&#xff0c;可以对头端进行插入删除操作 1.2 deque与vector区别&#xff1a; vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度比vector快vector访问元素…

vue中scss样式污染引发的思考

新做了一个项目&#xff0c;就是在登录后&#xff0c;就会产生左侧菜单的按钮颜色不一样。 然后发现样式是从这里传过来的 发现是登录页面的css给污染了 就是加了scope就把这个问题解决了 然后想总结一下这个思路&#xff1a;就是如何排查污染样式&#xff1a; 如果出现了…

东莞IBM服务器维修之IBM x3630 M4阵列恢复

记录东莞某抖音电商公司送修一台IBM SYSTEM X3630 M4文档服务器RAID6故障导致数据丢失的恢复案例 时间&#xff1a;2024年02月20日&#xff0c; 服务器品牌&#xff1a;IBM System x3630 M4&#xff0c;阵列卡用的是DELL PERC H730P 服务器用途和用户位置&#xff1a;某抖音电…