1. 题目

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

示例 1:
输入: [7,5,6,4]
输出: 5限制:
0 <= 数组长度 <= 50000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 归并排序

  • 详见 LeetCode 315. 计算右侧小于当前元素的个数(二叉查找树&二分查找&归并排序逆序数总结)

  • 方法1:后半部出队写入临时数组时,sum + 前半部 没有出来的个数(比后部出队的那个大)

  • 方法2:前半部出队,sum+ 后半部 已经出队的数量(比出队的那个小),有后续操作,当后半部全部出队了完毕,前半部继续出队,整个后半部分都比剩余的前半部分小。

两种方法只能取其一。

class Solution {int sum = 0;vector<int> temp;
public:int reversePairs(vector<int>& nums) {temp.resize(nums.size());mergesort(nums,0,nums.size()-1);return sum;}void mergesort(vector<int>& arr, int l ,int r){if(l >= r)return;int mid = l + ((r-l)>>1);mergesort(arr,l,mid);mergesort(arr,mid+1,r);merge(arr,l,mid,r);}void merge(vector<int>& arr, int l, int mid, int r){int i = l, j = mid+1, k = 0;// 方法1:后半部出队,sum+前半部 没有出来的个数(比后面大的)while(i <= mid && j <= r){if(arr[i] <= arr[j])temp[k++] = arr[i++];else{temp[k++] = arr[j++];sum += mid-i+1;}}while(i <= mid)//后面都出完了,前半部还剩一些temp[k++] = arr[i++];while(j <= r)temp[k++] = arr[j++];for(i = l,j = 0; j < k; )arr[i++] = temp[j++];//---------------------------------------------------//方法2:前半部出队,sum+ 后半部 已经出队的数量(比前面的小)while(i <= mid && j <= r){if(arr[i] <= arr[j]){temp[k++] = arr[i++];sum += j-(mid+1);}elsetemp[k++] = arr[j++];}while(i <= mid)//后面都出完了,前半部还剩一些,还需要操作{temp[k++] = arr[i++];sum += j-(mid+1);}while(j <= r)temp[k++] = arr[j++];for(i = l, j = 0; j < k; )arr[i++] = temp[j++];}
};

剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)相关推荐

  1. 剑指offer面试题[51]-数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  2. 剑指offer面试题[29]-数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  3. 剑指offer面试题[40]-数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 注意原题目要求空间复杂度为0(1). 位运算的具体思路可以参看剑指offer. class So ...

  4. 剑指offer面试题[36]-数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  5. 剑指Offer - 面试题3. 数组中重复的数字(哈希)

    1. 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组 ...

  6. 剑指offer 面试题03. 数组中重复的数字

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  7. 剑指offer面试题03. 数组中重复的数字(Array)

    题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...

  8. 剑指offer面试题39. 数组中出现次数超过一半的数字(数组)(摩尔投票法)

    题目描述 **数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素.** 思路 详见链接 代码 class Solution:def ...

  9. 剑指offer——面试题51:数组中重复的数字

    剑指offer--面试题51:数组中重复的数字 Solution1: 20180910更新.利用数组做一次hash映射,时间复杂度为O(n)O(n)O(n),空间复杂度O(n)O(n)O(n). cl ...

最新文章

  1. Windows 10安装Tensorflow
  2. 是vans_你知道VANS有哪些好鞋不贵系列?
  3. 一个有趣的Script脚本工具
  4. MySQL模糊查询—like关键字
  5. Fat Jar Eclipse Plug-In Tutorial
  6. 使用代码获得Hybris Commerce里显示的产品图片
  7. python 快速删除程序_如何快速一次性卸载所有python包(第三方库)呢
  8. Python函数(1)
  9. (第一章)数据库的类型
  10. 单元测试界的高富帅,Pytest框架,手把手教学,高阶用法实战
  11. Deteming the User Intent of Web Search Engine
  12. python——import日常学习记录
  13. java persistence,java-jpa(Java Persistence API)初识,
  14. 【深度学习】《动手学深度学习》环境配置
  15. DC影视作品及观看顺序
  16. 高代第2章第1节n元排列:奇排列、偶排列的判断
  17. linux高级格式化磁盘,linux下格式化磁盘及分区
  18. R+ECharts2Shiny实现web动态交互式可视化数据(中)
  19. vscode C++ debug: lldb: unrecognized option `--interpreter=mi'
  20. Hadoop配置—完全分布式

热门文章

  1. 挖矿为什么要用显卡_Conflux显卡挖矿收益很高吗?挖矿指南与核算手册
  2. gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习
  3. linux显示系统信息软件下载,linux查看系统信息软件安装信息命令学习笔记
  4. php实现服务器文件同步,PHPstorm配置同步服务器文件
  5. 支持多并发的单例有哪几种写法
  6. 《C++标准程序库》学习笔记5 — 第七章
  7. Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  8. (转)python调取C/C++的dll生成方法
  9. laravel 服务提供者
  10. Spark学习(一) -- Spark安装及简介