当前位置: 首页 > news >正文

分治算法---归并

1、排序数组

class Solution 
{vector<int> tmp;
public:vector<int> sortArray(vector<int>& nums) {tmp.resize(nums.size());mergeSort(nums,0,nums.size() - 1);return nums;}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;int cur2 = mid+1;int i = 0;while((cur1 <= mid)&&(cur2 <= right)){if(nums[cur1]>nums[cur2]){tmp[i++] =  nums[cur2++];}else{tmp[i++] = nums[cur1++];}}while(cur1 <= mid){tmp[i++] = nums[cur1++];}while(cur2 <= right){tmp[i++] = nums[cur2++];}for(int i = left; i <= right;i++){nums[i] = tmp[i - left];}}
};

 2、数组中的逆序对

(2)解题思路

方法一:暴力解法,一个一个的寻找,虽然可以找到,但是会超时

方法二:归并

我们可以先找左边部分的逆序对,再找右半部分逆序对,最后再找一左一右的,如果我们可以找的途中还能排序,会使最后一步非常的简单 变成了 左半部分 -》左排序 -》右半部分 -》右排序 -》一左一右,这和归并算法的思想差不多

class Solution 
{int tmp[50010];
public:int reversePairs(vector<int>& nums) {return mergeSort(nums,0,nums.size() - 1);}int mergeSort(vector<int>& nums, int left, int right){if(left>=right) return 0;int ret = 0;int mid = (left + right) >> 1;ret += mergeSort(nums,left,mid);ret += mergeSort(nums,mid+1,right);int i = 0;int cur1 = left;int cur2 = mid + 1;while(cur1 <=  mid && cur2 <= right){if(nums[cur1] <= nums[cur2]){tmp[i++] = nums[cur1++];}else{ret +=  mid - cur1 + 1;tmp[i++] = nums[cur2++];}}while(cur1<=mid){tmp[i++] = nums[cur1++];}while(cur2<=right){tmp[i++] = nums[cur2++];}for(int j = left; j<=right; j++){nums[j] = tmp[j -left];}return ret;}
};

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

方法一:暴力解法

方法二:和上述的算法差不多,先算左边的数,在算右边的数,再算左右两边,右侧小于当前元素的个数

class Solution 
{vector<int> tmp;vector<int> init;vector<int> ret;vector<int> tmpinit;
public:vector<int> countSmaller(vector<int>& nums) {tmp.resize(size(nums));init.resize(size(nums));ret.resize(size(nums));tmpinit.resize(size(nums));for(int i = 0; i<nums.size();i++){init[i] = i;}mergeSort(nums,0,nums.size() - 1);return ret;}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;int cur2 = mid+1;int i =0;while(cur1<=mid && cur2<=right){if(nums[cur1]>nums[cur2]){ret[init[cur1]]+= right - cur2 +1;tmp[i] = nums[cur1];tmpinit[i++] = init[cur1++];  }else{tmp[i] = nums[cur2];tmpinit[i++] = init[cur2++];  }}while(cur1<=mid){tmp[i] = nums[cur1];tmpinit[i++] = init[cur1++];  }while(cur2<=right){tmp[i] = nums[cur2];tmpinit[i++] = init[cur2++];  }for(int i = left ; i <= right; i++){nums[i] = tmp[i-left];init[i] = tmpinit[i-left];}}
};

5、翻转对

class Solution 
{vector<int> tmp;
public:int reversePairs(vector<int>& nums) {tmp.resize(size(nums));return mergeSort(nums,0,nums.size()-1);}int mergeSort(vector<int>& nums, int left, int right){int ret = 0;if(left>=right) return 0;int mid = (left + right) >> 1;ret += mergeSort(nums,left,mid);ret += mergeSort(nums,mid+1,right);int cur1 = left; int cur2 = mid+1;int i = 0;while(cur1<=mid){while(cur2<=right&&nums[cur2]>=nums[cur1]/2.0)cur2++;if(cur2 > right)break;ret += right - cur2 +1;cur1++;} cur1 = left;cur2 = mid + 1;while(cur1 <=  mid && cur2 <= right){if(nums[cur1] <= nums[cur2]){tmp[i++] = nums[cur2++];}else{tmp[i++] = nums[cur1++];}}while(cur1<=mid){tmp[i++] = nums[cur1++];}while(cur2<=right){tmp[i++] = nums[cur2++];}for(int j = left; j<=right; j++){nums[j] = tmp[j -left];}return ret;}
};

http://www.dtcms.com/a/289509.html

相关文章:

  • 智能制造——48页毕马威:汽车营销与研发数字化研究【附全文阅读】
  • Muduo库中单例模式详解
  • 【Anaconda】Conda 虚拟环境打包迁移教程
  • 基于ACPs协议的智能体互联网示例(多智能体旅游规划)
  • JMeter连接数据库
  • Linux操作系统从入门到实战(十一)回车换行问题与用户缓冲区问题
  • C++虚函数易错点整理
  • 20250720-4-Kubernetes 调度-指定节点调度:nodeSelectornodeAffinity笔记
  • LeetCode 3202.找出有效子序列的最大长度 II:取模性质(动态规划)
  • JDK8默认垃圾回收器
  • (Python)类和类的方法进阶(基础教程介绍)(Python基础教程)
  • 利用核壳生物支架调控纤维 - 成骨稳态【AbMole】
  • Linux:线程控制
  • 【网络编程】网络传输-JSON
  • 【C语言】字符串与字符函数详解(下)
  • Shell脚本-cut工具
  • 从零到一MCP快速入门实战【1】
  • 疯狂星期四第13天运营日报
  • Java拓扑排序:2115 从给定原材料中找到所有可以做出的菜
  • Linux 基本指令详解
  • Self-Consistency:跨学科一致性的理论与AI推理的可靠性基石
  • WebDriver 对象中的方法
  • C++STL系列之list
  • Vue DIY 内容文本超出组件
  • Numpy库,矩阵形状与维度操作
  • 矩阵算法题
  • ZYNQ创新实践:免IIC驱动直控MCP4661T数字电位器
  • ollama基本配置
  • 仙盟数据库应用-外贸标签打印系统 前端数据库-V8--毕业论文-—-—仙盟创梦IDE
  • 数据库操作丨C++ 操作 数据库——SQLServer 篇