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

leetcode 困难 —— 数组中的逆序对(分治法)

题目:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

题解:
① 我最开始想的蠢方法(会超时,可跳过)
首先题目求的逆序对,这考虑的关键应该就是 位置 和 大小

那么我们先将大小排个序,然后从小到大考虑

然后我们按数字从小到大放到由位置排序的容器中
每一次放入,二分搜索当前要放入值的位置,其之后的值的数量,就是该值组成的逆序对数量
这样是不是可以只用考虑位置(因为之前放入容器的值的大小都小于当前值)

这样排序 O(nlogn),然后每次放入值前二分搜索 O(nlogn),但是还是超时了
应该是那个 insert 复杂度太高了,没办法,vector 的 insert 复杂度为 O(n)
想过用其他容器,但好像都不能解决,要是大佬有方法,欢迎评论私信,真想不出来 😟

代码如下:

class Solution {
public:vector<pair<int, int> > temp1;vector<pair<int, int> > temp2;int reversePairs(vector<int>& nums) {int res = 0;for(int i = 0; i < nums.size(); i++) {temp1.push_back(make_pair(nums[i], i));}sort(temp1.begin(), temp1.end());for(int i = 0; i < temp1.size(); i++) {pair<int, int> t = make_pair(temp1[i].second, temp1[i].first);int f = lower_bound(temp2.begin(), temp2.end(), t) - temp2.begin();res = res + i - f;temp2.insert(temp2.begin() + f, t);}return res;}
};

② 分治法(害,我这笨脑子,真的想不到啊)
分治排序都知道吧
我们在排序的过程中,考虑逆序对数量

首先两个有序的序列,求逆序对数量
左边的序列中的某个值所组成逆序对等于右边所有小于它的值的数量

可以通过分治法求解的原理,即
局部的排序,不会影响这部分和其他部分组成逆序对

代码如下:

class Solution {
public:vector<int> numbers;int res = 0;void solve(int l, int r) {int mid = (r + l) / 2;if(r - l > 1) {solve(l, mid);solve(mid, r);}else {return;}vector<int> temp;int flag1 = l, flag2 = mid;while(flag1 < mid) {while(flag2 < r && numbers[flag1] > numbers[flag2]) {temp.push_back(numbers[flag2]);flag2++;}temp.push_back(numbers[flag1]);flag1++;res = res + flag2 - mid;}while(flag2 < r) {temp.push_back(numbers[flag2]);flag2++;}for(int i = l; i < r; i++) {numbers[i] = temp[i - l];}}int reversePairs(vector<int>& nums) {numbers = nums;solve(0, nums.size());return res;}
};
http://www.lryc.cn/news/20702.html

相关文章:

  • 02.24:图片的风格转换
  • [SSD综述 1.3] SSD及固态存储技术半个世纪发展史
  • PAT 1023 组个最小数(分数20)题目有bug
  • QML 中的 5 大布局
  • 使用Python进行数据分析——线性回归分析
  • 我眼中的柔宇科技
  • Allegro如何快速把视图居中显示操作指导
  • 搜索相关功能
  • 【从零开始制作 bt 下载器】一、了解 torrent 文件
  • SystemVerilog-时序逻辑建模(5)多个时钟和时钟域交叉
  • 基本中型网络的仿真(RYU+Mininet的SDN架构)-以校园为例
  • 西北工业大学大学物理(II)期末试题选填解析2021-2022
  • 【USB】windows热插拔通知接口分析
  • CMake入门
  • python中一种编写config文件并及时更新的方法
  • 基于Windows下离线安装当前最新Arduino ESP32 SDK(2.0.7)固件开发包
  • Android 9.0 app添加校验锁(输入密码才能进入app)
  • 注意力机制详解系列(二):通道注意力机制
  • 动态规划-规划兼职工作
  • Redis学习笔记(二)Redis基础(基于5.0.5版本)
  • Ancaonda常用cmd命令总结
  • yolov5_reid【附代码,行人重识别,可做跨视频人员检测】
  • 多模态预训练模型综述
  • 华为OD机试题,用 Java 解【玩牌高手】问题
  • 数学建模 latex 图片以及表格排版整理(overleaf)
  • 进程优先级(Linux)
  • [面试直通版]网络协议面试核心之IP,TCP,UDP-TCP与UDP协议的区别
  • VO,BO,PO,DO,DTO,AO的区别
  • JavaSE学习笔记day15
  • Spring Security认证研究