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

一种直观的思路是通过暴力破解的方法,时间复杂度为O(N*N)。除此以外,我们还可以借鉴归并排序的思想来求解逆数对。
归并排序在合并数组的时候回比较前后两个数组元素的大小,在这个时候就可以得到每个元素的逆序对second-mid,时间复杂度为O(NLogN)。
注:1.cnt之所以是second-mid,是因为每当左数组的某一个元素排序时,在它前面进入temp元素的必然比它小,这个元素可以和之前进入temp的每一个元素组成逆序对,总共有second-mid对。
2.在归并排序时,每次改变的只是left到right的一部分,所以temp和num的改变范围都是l到r。

 int reversePairs(vector<int>& nums) {vector<int> temp=nums;int cnt=0;merge_sort (nums,temp,0,nums.size(),cnt);return cnt;}void merge_sort(vector<int> &num,vector<int> &temp,int l,int r,int &cnt){if(l+1>=r)return ;int mid=(l+r)/2;merge_sort(num,temp,l,mid,cnt);merge_sort(num,temp,mid,r,cnt);int first=l,second=mid;int i=l;while(first<mid||second<r){if(second>=r||(num[first]<=num[second]&&first<mid)){temp[i++]=num[first++];cnt+=second-mid;}else{temp[i++]=num[second++];}}for(int i=l;i<r;++i)num[i]=temp[i];}

剑指offer35——数组中的逆数对相关推荐

  1. 剑指offer 数组中的逆数对

    链接:https://www.nowcoder.com/profile/8740530/codeBookDetail?submissionId=9156674 来源:牛客网class Solution ...

  2. 剑指Offer_35_数组中的逆序对

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

  3. 剑指offer 数组中的逆序对

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

  4. 2021-09-03剑指Offer51.数组中的逆序对

    class Solution {int[] nums, tmp;//表示未分配长度的数组指针?//java的默认权限是共有还是私有?public int reversePairs(int[] nums ...

  5. 剑指offer03.数组中重复的数字

    剑指offer03.数组中重复的数字 题目 第一种解法 第二种解法 第三种解法 值得一提的东西 题目 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的 ...

  6. 剑指OFFER----51、数组中的逆数对(js实现)

    题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. 输入一个数组,求出这个数组中的逆序对. 例如在数组 {7, 5, 6, 4} 中,一共存在 5 个逆序对, 分别是 ...

  7. 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字

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

  8. 剑指_数组中出现次数超过一半的数字

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

  9. python剑指offer数组中出现次数超过一半的数字

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

最新文章

  1. C/C++ VS java
  2. ios 支付宝支付集成
  3. asp.net开发中自定义网站的目录
  4. crontab命令的使用
  5. 实例工厂配置bean
  6. (五)LESS 规范
  7. C++ STL之Vector
  8. 【热点】WPA2协议遭破解,全世界wifi不安全了
  9. 基于Spring+SpringMVC+Mybatis架构的开源博客
  10. 【小技巧积累】用Style实现必填提示“*”根据选项的不同而显示或隐藏
  11. python后端开发书籍_后端书籍推荐
  12. Bailian4047 全排列【全排列】
  13. ASCII、Unicode、GBK和UTF-8字符编码的区别联系[转]
  14. IDEA失去焦点,取消自动编译【已解决】
  15. 直播软件测试相关技巧
  16. lcd开机流程图_LCD1602初始化流程图及程序的两种方法
  17. 《汉字简体、繁体相互转换》 查看源代码
  18. 数据预处理1:无量纲化especially for Scaler
  19. 【POJ 3311】Hie with the Pie(状压DP)
  20. QQ群创建者和管理员

热门文章

  1. WPF Event事件
  2. 英特尔LOGO首次为AI变粉 助力《时尚健康》粉红丝带活动
  3. 拍照之外, 游戏手机会成为手机新品类吗?
  4. windows系统下实现nlb集群负载均衡
  5. 高斯模糊原理(Gaussian Blur)
  6. 自动化测试面试题及答案大全,赶紧收藏吧!
  7. SetEvent()和ResetEvent()
  8. gridview连接接SQL server .mdf文件时没有打开此文件的权限,请与文件所有者或管理员联系以获得相应权限
  9. 蒙特卡洛树搜索 MCTS
  10. CSS Grid详解