原创博文,转载请注明出处!
本题牛客网地址

博客文章索引地址

博客文章中代码的github地址

1.题目

2.思路

3.代码

  1 class Solution {
2 public:
3 int InversePairs(vector<int> data) {
4 if(data.size() == 0){
5 return 0;
6 }
7 // 排序的辅助数组
8 vector<int> copy;
9 for(int i = 0; i < data.size(); ++i){
10 copy.push_back(data[i]);
11 }
12 return InversePairsCore(data, copy, 0, data.size() - 1) % 1000000007;
13 }
14 long InversePairsCore(vector<int> &data, vector<int> &copy, int begin, int end){
15 // 如果指向相同位置,则没有逆序对。
16 if(begin == end){
17 copy[begin] = data[end];
18 return 0;
19 }
20 // 求中点
21 int mid = (end + begin) >> 1;
22 // 使data左半段有序,并返回左半段逆序对的数目
23 long leftCount = InversePairsCore(copy, data, begin, mid);
24 // 使data右半段有序,并返回右半段逆序对的数目
25 long rightCount = InversePairsCore(copy, data, mid + 1, end);
26
27 int i = mid; // i初始化为前半段最后一个数字的下标
28 int j = end; // j初始化为后半段最后一个数字的下标
29 int indexcopy = end; // 辅助数组复制的数组的最后一个数字的下标
30 long count = 0; // 计数,逆序对的个数,注意类型
31
32 while(i >= begin && j >= mid + 1){
33 if(data[i] > data[j]){
34 copy[indexcopy--] = data[i--];
35 count += j - mid;
36 }
37 else{
38 copy[indexcopy--] = data[j--];
39 }
40 }
41 for(;i >= begin; --i){
42 copy[indexcopy--] = data[i];
43 }
44 for(;j >= mid + 1; --j){
45 copy[indexcopy--] = data[j];
46 }
47 return leftCount + rightCount + count;
48 }
49 };

【剑指offer】数组中的逆序对,C++实现的更多相关文章

  1. [剑指OFFER] 数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.     分析:利用归并排序的思想,分成2部分,每一部分按照从大到 ...

  2. 剑指Offer——数组中的逆序对

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

  3. 用js刷剑指offer(数组中的逆序对)

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

  4. 剑指Offer——数组中的逆序对(归并排序的应用)

    蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%.   归并法: 看讨论,知道了这道题的经典 ...

  5. 剑指 Offer——数组中的逆序对

    1. 题目 2. 解答 借助于归并排序的分治思想,在每次合并的时候统计逆序对.因为要合并的两个数组都是有序的,如果左半部分数组当前值大于右半部分数组当前值,那么左半部分数组当前值右边的数就都大于右半部 ...

  6. 剑指offer_数组中的逆序对

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

  7. 剑指Offer-34.数组中的逆序对(C++/Java)

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

  8. 剑指Offer34 数组中的逆序对

    /************************************************************************* > File Name: 34_Invers ...

  9. 剑指offer-数组中的逆序对-数组-python

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

  10. 剑指 Offer —— 数组中重复的数字

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

随机推荐

  1. $ python-json模块的基本用法

    准备工作 import json # 准备数据: d = dict(name = 'Tom',age = 18) json_str = '{"name":"Tom&quo ...

  2. filter方法解析

    filter一般用于将数组中的某些元素过滤掉,并生成一个新的数组 基本语法如下: var newArray= arrayObj.filter(functionObj); newArray 根据过滤条件 ...

  3. 2062326 齐力锋 实验三《敏捷开发与XP实践》实验报告

    北京电子科技学院(BESTI) 实 验 报 告 课程: 程序设计与数据结构 班级: 1623 姓名: 齐力锋 学号: 20162326 成绩: 指导教师: 娄嘉鹏/王志强 实验日期: 2017年5月1 ...

  4. zabbix监控使用

    zabbix监控 通过导入/导出zabbix配置文件,我们可以将自己写好的模板等配置在网络上分享,我们也可以导入网络上分享的配置文件,配置文件有两种格式,分为xml与json,通过zabbix管理界面 ...

  5. Gnostice PDFtoolkit VCL的安装

    Installation and Uninstallation For New Users Close all open applications including the IDE. Run the ...

  6. 解决hive交互模式退格键乱码

    在hive的交互模式下,输入退格.方向键等,出现乱码,可以通过如下方法解决: 1.修改bashrc文件: vi ~/.bashrc 在文件最后添加一行: stty erase ^H. 2.使修改生效: ...

  7. ubuntu 14.04 建立wifi热点

    昨天突然想起来我可以用笔记本搞一个热点这样我的手机就不用上流量了,但是手机死活搜不到建好的信号,目前的解决方案如下: 直接用ubuntu自带的创建wifi网络功能是不好使的,因为android系统不支 ...

  8. Hibernate -- 映射多对多双向关联关系

    1. 示例代码: Student.java package cn.itcast.many2many; import java.util.HashSet; import java.util.Set; @ ...

  9. iscroll.js的简单使用方法(总结)

    iscroll.js的简单使用方法(总结) 一.总结 一句话总结:Scroll是一个类,每个需要使用滚动功能的区域均要进行初始化. 最佳的HTML结构如下: <div id="wrap ...

  10. Ajax-05 使用XMLHttpRequest和jQuery实现Ajax实例

    需求: (django)使用XMLHttpRequest和jQuery实现Ajax加法运算 url.py: from django.conf.urls import url from hello im ...