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

【C++算法】分治——归并

排序数组

  • 题目链接

排序数组icon-default.png?t=O83Ahttps://leetcode.cn/problems/sort-an-array/description/

  • 算法原理

  • 代码步骤
class Solution {vector<int> tmp;
public:vector<int> sortArray(vector<int>& nums) {tmp.resize(nums.size());merge(nums, 0, nums.size() - 1);return nums;}void merge(vector<int>& nums, int left, int right){if(left >= right) return;int mid = (right + left) >> 1;merge(nums, left, mid);merge(nums, mid + 1, right);int i = 0, cur1 = left, cur2 = mid + 1;while(cur1 <= mid && cur2 <= right){tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];}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];}}
};

交易逆序对的总数

  • 题目链接

交易逆序对的总数icon-default.png?t=O83Ahttps://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/description/

  • 算法原理

  • 代码步骤
class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& record) {tmp.resize(record.size());return merge(record, 0, record.size() - 1);}int merge(vector<int>& nums, int left, int right){int ret = 0;if(left >= right) return 0;int mid = (left + right) >> 1;ret += merge(nums, left, mid);ret += merge(nums, mid + 1, right);int i = 0, cur1 = left, 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 i = left; i <= right; i++){nums[i] = tmp[i - left];}return ret;}
};

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

  • 题目链接

计算右侧小于当前元素的个数icon-default.png?t=O83Ahttps://leetcode.cn/problems/count-of-smaller-numbers-after-self/description/

  • 算法原理

  • 代码步骤
class Solution {vector<int> ret;vector<int> index;int tmpNums[100001];int tmpIndex[100001];
public:vector<int> countSmaller(vector<int>& nums) {int n = nums.size();ret.resize(n);index.resize(n);for(int i = 0; i < n; i++){index[i] = i;}mergeSort(nums, 0, n - 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 i = 0, cur1 = left, cur2 = mid + 1;while(cur1 <= mid && cur2 <= right){if(nums[cur1] <= nums[cur2]){tmpNums[i] = nums[cur2];tmpIndex[i++] = index[cur2++];}else{ret[index[cur1]] += right - cur2 + 1;tmpNums[i] = nums[cur1];tmpIndex[i++] = index[cur1++];}}while(cur1 <= mid) {tmpNums[i] = nums[cur1];tmpIndex[i++] = index[cur1++];}while(cur2 <= right){tmpNums[i] = nums[cur2];tmpIndex[i++] = index[cur2++];}for(int i = left; i <= right; i++){nums[i] = tmpNums[i - left];index[i] = tmpIndex[i - left];}}
};

翻转对

  • 题目链接

翻转对icon-default.png?t=O83Ahttps://leetcode.cn/problems/reverse-pairs/description/

  • 算法原理

  • 代码步骤
class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& nums) {int n = nums.size();tmp.resize(n);return mergeSort(nums, 0, n - 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 cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2 <= right){while(cur2 <= right && nums[cur1] / 2.0 <= nums[cur2]){cur2++;}ret += right - cur2 + 1;cur1++;}cur1 = left, cur2 = mid + 1;while(cur1 <= mid && cur2 <= right){if(nums[cur1] >= nums[cur2]) {tmp[i++] = nums[cur1++];}else{tmp[i++] = nums[cur2++];}}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];}return ret;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 每日必抢小程序下单总结
  • C++——深部解析哈希
  • 助力汽车零部件产业发展,2025 第十二届广州国际汽车零部件加工技术及汽车模具展览会与您相约“羊城”广州
  • 了解elementUI的底层源码, 进行二次开发
  • SpringBoot项目获取统一前缀配置以及获取非确定名称配置
  • python画图|3D surface基础教程
  • 【诉讼流程-健身房-违约-私教课-多次沟通无效-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(1)】
  • tensor 的运算(加法、点乘、矩阵乘法)
  • node.js框架StrongLoop快速入门实战
  • Python编码系列—Python建造者模式:构建复杂对象的优雅之道
  • C++学习笔记(22)
  • llvm后端之函数栈帧
  • Mastering openFrameworks_第五章_使用视频
  • 健身管理|基于java的健身管理系统小程序(源码+数据库+文档)
  • 清理.svn文件夹执行命令bat
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [译]如何构建服务器端web组件,为何要构建?
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 0x05 Python数据分析,Anaconda八斩刀
  • 30秒的PHP代码片段(1)数组 - Array
  • Angular Elements 及其运作原理
  • Hibernate最全面试题
  • JavaScript-Array类型
  • javascript从右向左截取指定位数字符的3种方法
  • JS变量作用域
  • node-glob通配符
  • PHP变量
  • Python_OOP
  • Rancher如何对接Ceph-RBD块存储
  • Spring Boot快速入门(一):Hello Spring Boot
  • SwizzleMethod 黑魔法
  • TCP拥塞控制
  • use Google search engine
  • Zsh 开发指南(第十四篇 文件读写)
  • 记录一下第一次使用npm
  • 前端
  • 设计模式 开闭原则
  • 深度学习入门:10门免费线上课程推荐
  • 怎么将电脑中的声音录制成WAV格式
  • 《码出高效》学习笔记与书中错误记录
  • 交换综合实验一
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #QT(TCP网络编程-服务端)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (23)Linux的软硬连接
  • (zt)最盛行的警世狂言(爆笑)
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (黑马C++)L06 重载与继承
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)程序员技术练级攻略