Leetcode每日一题:493.reverse-pairs(翻转对)
官方题解给出的解题思路还是比较清晰的,分治到不能再分后,开始分别计算两个子序列各自的翻转数,然后归并:归并后的翻转数=二者各自翻转数之和+两个子序列之间可能构成的翻转对(两个循环即可求出);然后排完序继续归并,规模不断扩大;
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(翻转对)相关推荐
- Leetcode每日一题:226.invert-binary-tree(翻转二叉树)
思路:就是将节点的左指针指向右孩子,右指针指向左孩子,递归即可实现: /*** Definition for a binary tree node.* struct TreeNode {* int v ...
- LeetCode每日一题——670. 最大交换
LeetCode每日一题系列 题目:670. 最大交换 难度:中等 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给定一个非负整数,你至多可以交换一次数字中的任意两位.返回你能 ...
- leetcode每日刷题计划-简单篇day8
leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...
- Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)
思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...
- 【LeetCode每日一题】1723. 完成所有工作的最短时间
[LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...
- leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用
leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...
- LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色
LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...
- 【LeetCode每日一题】——109.有序链表转换二叉搜索树
文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...
- leetcode每日一题·救生艇问题(Python)
leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...
- LeetCode每日一题——904. 水果成篮
LeetCode每日一题系列 题目:904. 水果成篮 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整 ...
最新文章
- python的安装教程-python安装教程 Pycharm安装详细教程
- 学习MSCKF笔记——前端、图像金字塔光流、Two Point Ransac
- 工作10年厌倦写代码_厌倦了数据质量讨论?
- kaggle(05)---Event Recommendation Engine Challenge(基础版)
- java拷贝文件夹和删除文件夹
- 【python基础知识】写入文件指定编码格式,例如utf-8
- java里的sqlite在哪_设备上sqlite数据库的位置
- 26.Linux/Unix 系统编程手册(上) -- 监控子进程
- 5.4.3控制器设计 微程序控制器 微指令的设计
- 路由交换技术-实验4:VLAN创建、划分、修剪及Trunk链路
- PS 图片背景变为透明
- UML(thinking in uml 学习)--参与者和业务工人和涉众
- FPGA内部资源结构——以Altera CycloneⅣ 为例
- Java中的数组注意点
- 【这是一个还没有被证实是否有效的小白修炼手册】数据结构入门第一课基本概念
- configmap资源简介和应用
- 多发性胆囊息肉有哪些危害?
- 初学5之坦克要求(做出坦克被子弹击中时的爆炸效果)
- 关于文献HEVC-The New Glod Standard For Video Compress的理解
- Java复习笔记入门阶段06:方法