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

【剑斩OFFER】算法的暴力美学——交易逆序对的总数

一、题目描述

二、算法原理

我们可以把数组分成两部分:

那么原数组的逆对序 = 紫色数组里面的逆对序 + 蓝色数组里面的逆对序 + 紫色和蓝色组合成多少个逆对序。

由上面的推理得出,这个过程是和递归排序是非常相似的,只不过是递归序列的升序的罢了,那么我们可以尝试一下看一下递归排序的和这道题目的会不会冲突:

此时最后一步就是统计第一个数组里面大于第二个数组里面的数字有多少个组合,那么当 7 大于 4 时,此时 7 后面的数字都大于 4 ,所以我们让逆对序 += (数组的最后一个数字的下标 - 指向 7 数字下标 + 1) 这就是 7 和第二个数组里面的组合成的逆对序的个数。

所以我们可以看出递归排序的升序是不会影响我们统计逆对序的,故而我们可以完全使用递归排序来解决这道题目。

三、代码实现

class Solution { public: int reversePairs(vector<int>& record) { vector<int> tmp(record.size()); return Quicksort(0,record.size() - 1, record,tmp); } int Quicksort(int l,int r,vector<int>& nums,vector<int>& tmp) { if(l >= r) return 0; int keyi = l + (r - l) / 2; int count = 0; count += Quicksort(l,keyi,nums,tmp);//左边:【 l , keyi 】 count += Quicksort(keyi + 1,r,nums,tmp);//右边:【keyi + 1,r 】 int begin1 = l,end1 = keyi;//左边数组 int begin2 = keyi + 1,end2 = r;//右边数组 int index = l; while(begin1 <= end1 && begin2 <= end2)//比较遍历 { if(nums[begin1] > nums[begin2]) { tmp[index++] = nums[begin2++]; count += (end1 - begin1 + 1);//因为数组此时是升序的,所以当 nums[ begin1 ] > nums[ begin2 ],nums[ begin1 ] 后面的数字都大于 nums[ begin2 ] } else tmp[index++] = nums[begin1++]; } while(begin1 <= end1) { tmp[index++] = nums[begin1++];//把左边剩余的数字放到 tmp } while(begin2 <= end2) { tmp[index++] = nums[begin2++];//把右边剩余的数字放到 tmp } for(int i = l;i < index;i++) nums[i] = tmp[i];//把 tmp 里面的数字放回到原数组 nums return count; } };
http://www.cnnetsun.cn/news/1380.html

相关文章:

  • 【全栈硬核实战】从零手搓一个基于 Gin + JS 的鉴权闭环系统
  • 【每天一个AI小知识】:什么是生成式AI?
  • C#字符串操作:11个必备方法全解析
  • Spring AOP场景2——数据脱敏(附带源码)
  • linux知识点-服务相关
  • 基于springboot会议室管理系统的设计与实现-计算机毕设 附源码 30986
  • Python 第三方库的安装与卸载指南
  • 安装 rustrover ,本来一个 IDE 能实现全部能力的情况下JetBarins 搞了N个编辑器
  • RustRover 新建项目的前提之一: Install Rustup
  • brew 安装 rustup ,以及初始化 rustup default stable
  • brew 安装 restup 的全过程 rustup default stable ,以及错误
  • 通过 Brew 安装 rustup 后,要在 rustrover 配置; 以及 Brew 之后需要 source $HOME/.cargo/env
  • 被京能数智笔记播客狠狠种草!文章一键转 4 种结构化笔记,私域效率党直接封神
  • 第十四章聚类方法理论及Python实现
  • VUE快速入门
  • Ajax-快速学习
  • Incoloy 907高性能的铁镍钴基高温合金Incoloy907英科耐尔合金
  • Incoloy945镍铁铬合金Incoloy 945应用领域在‌高强度紧固件、阀门、涡轮部件‌
  • Incoloy945X(UNS N09945)镍铁铬基沉淀硬化合金Incoloy 945X合金板材 合金锻件
  • Incoloy 020是一种高性能的‌镍-铁-铬合金‌Incoloy020棒料 锻件 带材
  • 如何在GraniStudio零代码平台搭建MES的零代码生产监控看板开发?
  • 如何在GraniStudio零代码将算子封装成方法,实现封装算子功能?
  • GraniStudio零代码平台支持哪些品牌的相机?
  • GraniStudio零代码平台支持多少种厂家IO模块和IO模块型号?
  • GraniStudio零代码平台通信(如 TCP服务器 )工具支持几种?
  • GraniStudio零代码平台支持OPC协议吗?
  • GraniStudio零代码平台支持多少种数据库?分别是什么数据库?
  • 如何使用GraniStudio零代码平台类型转换算子?哪些数据类型之间可以互转?
  • GraniStudio零代码平台支持多少种处理字符串方式?分别都是使用什么方式处理?
  • C++数据结构:stack实现