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

【分治】翻转对

文章目录

  • 493. 翻转对
  • 解题思路:归并排序 + 双指针

在这里插入图片描述

493. 翻转对

493. 翻转对

​ 给定一个数组 nums ,如果 i < jnums[i] > 2*nums[j] 我们就将 (i, j) 称作一个*重要翻转对*

​ 你需要返回给定数组中的重要翻转对的数量。

示例 1:

输入: [1,3,2,3,1]
输出: 2

示例 2:

输入: [2,4,3,5,1]
输出: 3

注意:

  1. 给定数组的长度不会超过50000
  2. 输入数组中的所有数字都在32位整数的表示范围内。

解题思路:归并排序 + 双指针

​ 这道题又是借鉴 剑指 Offer 51. 数组中的逆序对 的解题思路,其中两个思路都是可以的,也就是说升序和降序的情况都能解决这道题,因为这道题要找的是大于后面的,所以就 采用降序的思路,升序的思路可以自己尝试,只需要改改条件就能达到!

​ 不过这道题不同的是,它的判断条件变成了 nums[i] > 2*nums[j],如果我们在分治后合并的时候顺便处理的话,其实是不太方便的,因为合并的时候拷贝到临时数组的条件是只要大于或者小于等于一倍的条件即可,所以我们 单独把计算翻转对个数的事情拎出来

​ 这里计算翻转对,采用的是 双指针的思想,让 cur1cur2 都不回退的往右走(自己结合降序情况分析为什么可以不回退,一直往右走)并且不断的判断是否有成立的区间,是的话则累加翻转对个数,直到两个指针有一个出界为止!

​ 具体步骤如下图所示:

在这里插入图片描述

​ 然后接着就是归并排序中的合并操作了,这个已经轻车熟路了,就不再赘述了!具体的参考下面代码:

class Solution {
private:vector<int> tmp; // 辅助数组
public:int reversePairs(vector<int>& nums) {int n = nums.size();tmp.resize(n);return merge_sort(nums, 0, n - 1);}int merge_sort(vector<int>& nums, int left, int right){if(left >= right)return 0;// 先分治int ret = 0;int mid = (left + right) >> 1;ret += merge_sort(nums, left, mid);ret += merge_sort(nums, mid + 1, right);// 重点:在合并之前,利用双指针计算翻转对的数量(目前两个数组是降序的情况)int cur1 = left, cur2 = mid + 1;while(cur1 <= mid && cur2 <= right){if((nums[cur1] / 2.0) <= nums[cur2]) // 不满足则让cur2往右走cur2++;else{ret += right - cur2 + 1; // 满足则累加满足条件的区间个数cur1++;}}// 处理完翻转对之后再合并两个有序数组cur1 = left, cur2 = mid + 1;int i = left;while(cur1 <= mid && cur2 <= right){if(nums[cur1] <= nums[cur2])tmp[i++] = nums[cur2++];elsetmp[i++] = nums[cur1++];}while(cur1 <= mid)   tmp[i++] = nums[cur1++];while(cur2 <= right) tmp[i++] = nums[cur2++];// 最后拷贝到原数组中while(left <= right){nums[left] = tmp[left];left++;}return ret;}
};

在这里插入图片描述

http://www.xdnf.cn/news/9642.html

相关文章:

  • jsrpc进阶模式 秒杀js前端逆向问题 burp联动进行爆破
  • 【JavaEE】Spring事务
  • c++设计模式-介绍
  • 摩尔条纹 原理以及matlab 实现
  • 数据结构 - 树的遍历
  • 【JavaEE】-- 网络原理
  • NetLink
  • SNTP在电力系统通信中的应用
  • C# NX二次开发-查找连续倒圆角面
  • GB/T 36140-2018 装配式玻纤增强无机材料复合保温墙体检测
  • 【第2章 绘制】2.7 路径、描边与填充
  • 【C++进阶篇】哈希表的模拟实现(赋源码)
  • WSL中ubuntu通过Windows带代理访问github
  • 【razor】采集的同时支持预览和传输的讨论和改造方案探讨
  • DAY38
  • 整合Jdk17+Spring Boot3.2+Elasticsearch9.0+mybatis3.5.12的简单用法
  • 电化学震荡- N 型负微分电阻
  • Android LiveData 详解
  • QT使用cmake添加资源文件闪退,创建了qrc文件不能添加的问题解决
  • 深圳SMT贴片打样全流程优化方案
  • 在监视器(Monitor)内部,是如何做线程同步的?
  • 半桥栅极驱动芯片D2104M使用手册
  • 虚拟机配置网络
  • mac10.15.7 安装erlang23.3 源码安装(未完待续)
  • Compass Arena大模型竞技场
  • Linux中的Shell脚本基础
  • 易学探索助手-项目记录(十一)
  • Polar编译码(SCL译码)和LDPC编译码(BP译码)的matlab性能仿真,并对比香浓限
  • 96. 不同的二叉搜索树
  • uniapp调用java接口 跨域问题