官方题解给出的解题思路还是比较清晰的,分治到不能再分后,开始分别计算两个子序列各自的翻转数,然后归并:归并后的翻转数=二者各自翻转数之和+两个子序列之间可能构成的翻转对(两个循环即可求出);然后排完序继续归并,规模不断扩大;

class Solution {public:int reversePairs(vector<int> &nums, int left, int right){// 边界条件:分到只有一个元素了,重要翻转对数为0if (left == right){return 0;}int mid = (left + right) / 2;// 计算左右两边得翻转对int r1 = reversePairs(nums, left, mid);int r2 = reversePairs(nums, mid + 1, right);// 该阶段翻转对数为两个子序列各自翻转对之和+二者之间可能存在的翻转对int ret = r1 + r2;int i = left, j = mid + 1;while (i <= mid){//从j=mid+1开始,满足翻转对条件就让j++,因为是升序排序,所以后面某个位置不再满足条件;//这里的可以用二分查找优化while (j <= right && (long long)nums[i] > 2 * (long long)nums[j])j++;//加上二者之间存在的翻转对ret += j - mid - 1;i++;}//合并两个子序列i = left;j = mid + 1;int cur = 0;vector<int> sorted(right - left + 1);while (i <= mid || j <= right){if (i > mid){sorted[cur++] = nums[j++];}else if (j > right){sorted[cur++] = nums[i++];}else{if (nums[i] < nums[j]){sorted[cur++] = nums[i++];}else{sorted[cur++] = nums[j++];}}}for (int i = 0, len = right - left + 1; i < len; i++){nums[left + i] = sorted[i];}return ret;}int reversePairs(vector<int> &nums){int len = nums.size();if (len < 2)return 0;return reversePairs(nums, 0, len - 1);}
};

Leetcode每日一题:493.reverse-pairs(翻转对)相关推荐

  1. Leetcode每日一题:226.invert-binary-tree(翻转二叉树)

    思路:就是将节点的左指针指向右孩子,右指针指向左孩子,递归即可实现: /*** Definition for a binary tree node.* struct TreeNode {* int v ...

  2. LeetCode每日一题——670. 最大交换

    LeetCode每日一题系列 题目:670. 最大交换 难度:中等 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给定一个非负整数,你至多可以交换一次数字中的任意两位.返回你能 ...

  3. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  4. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  5. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  6. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

  7. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

  8. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  9. leetcode每日一题·救生艇问题(Python)

    leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...

  10. LeetCode每日一题——904. 水果成篮

    LeetCode每日一题系列 题目:904. 水果成篮 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整 ...

最新文章

  1. python的安装教程-python安装教程 Pycharm安装详细教程
  2. 学习MSCKF笔记——前端、图像金字塔光流、Two Point Ransac
  3. 工作10年厌倦写代码_厌倦了数据质量讨论?
  4. kaggle(05)---Event Recommendation Engine Challenge(基础版)
  5. java拷贝文件夹和删除文件夹
  6. 【python基础知识】写入文件指定编码格式,例如utf-8
  7. java里的sqlite在哪_设备上sqlite数据库的位置
  8. 26.Linux/Unix 系统编程手册(上) -- 监控子进程
  9. 5.4.3控制器设计 微程序控制器 微指令的设计
  10. 路由交换技术-实验4:VLAN创建、划分、修剪及Trunk链路
  11. PS 图片背景变为透明
  12. UML(thinking in uml 学习)--参与者和业务工人和涉众
  13. FPGA内部资源结构——以Altera CycloneⅣ 为例
  14. Java中的数组注意点
  15. 【这是一个还没有被证实是否有效的小白修炼手册】数据结构入门第一课基本概念
  16. configmap资源简介和应用
  17. 多发性胆囊息肉有哪些危害?
  18. 初学5之坦克要求(做出坦克被子弹击中时的爆炸效果)
  19. 关于文献HEVC-The New Glod Standard For Video Compress的理解
  20. Java复习笔记入门阶段06:方法

热门文章

  1. 学习笔记——SM2算法原理及实现
  2. django--rtbac权限管理
  3. 阿里云Ubuntu安装LNMP环境之Mysql
  4. iOS开发之各种动画各种页面切面效果
  5. Linux automake命令
  6. 用php向MySQL的datetime类型插入数据
  7. JavaScript 源型链
  8. BZOJ4653: [Noi2016]区间(线段树 双指针)
  9. 关于std::string和 C-style string的一些知识点备忘
  10. faster rcnn一些博客