【剑指offer】数组中的逆序对。C++实现
原创文章,转载请注明出处!
# 题目
# 思路
基于归并排序的思想统计逆序对:先把数组分割成子数组,再子数组合并的过程中统计逆序对的数目。统计逆序对时,先统计子数组内部的逆序对的数目,再统计相邻子数组的逆序对数目。
1.基于归并思想统计逆序对的过程
2.合并子数组统计逆序对的过程
把长度为2的子数组合并、排序并统计逆序对的过程。
# 代码
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出, 即输出P%1000000007。题目保证输入的数组中没有过相同的数字。
1 #include <iostream>
2 #include <vector>
3 using namespace std;
4
5 class Solution{
6 public:
7 int count=0;
8 int InversePairs(vector<int> data)
9 {
10 // 检查边界条件
11 if(data.size() != 0)
12 {
13 MergeSort(data,0,data.size()-1);
14 }
15 return count;
16 }
17
18 private:
19 void MergeSort(vector<int> a, int l, int r)
20 {
21 /* 将长度为n的输入序列分成两个长度为n/2的子序列 */
22 if (l < r)
23 {
24 /* 中间元素*/
25 int m = (l + r) >>1;
26
27 // 递归拆分
28 MergeSort(a, l, m);
29 MergeSort(a, m + 1, r);
30
31 // 递归合并
32 Merge(a, l, m, r);
33 }
34 }
35 void Merge(vector<int> a, int l, int m, int r)
36 {
37 vector<int> t;
38 //int p = 0; /* p指向辅助数组 */
39 int i = l; /* i指向第一个子表 */
40 int j = m + 1;/* j指向第二个子表 */
41
42 /* 两个子表都不为空时 */
43 while(i <= m && j <= r)
44 {
45 /* 取关键字小的元素转移至临时数组 */
46 if (a[i] > a[j])
47 {
48 t.push_back(a[j++]);
49 count=(count+m-i+1)%1000000007;
50 }
51 else
52 t.push_back(a[i++]);
53 }
54
55 while(i <= m) t.push_back(a[i++]);/* 将非空的输入区间转移至输出区间 */
56 while(j <= r) t.push_back(a[j++]);
57
58 for (i = 0; i < t.size(); i++) a[l + i] = t[i];/* 归并完成后将结果复制到原输入数组 */
59 }
60 };
61
62 int main()
63 {
64 vector<int> a = {8,7,6,5,455,88,888,9999,546,46548,1315,445,554,111,5222,2264,8,331,454548};
65 Solution solution;
66 solution.InversePairs(a);
67 return 0;
68 }
【剑指offer】数组中的逆序对。C++实现的更多相关文章
- [剑指OFFER] 数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 分析:利用归并排序的思想,分成2部分,每一部分按照从大到 ...
- 剑指Offer——数组中的逆序对
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100 ...
- 用js刷剑指offer(数组中的逆序对)
题目描述 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P ...
- 剑指Offer——数组中的逆序对(归并排序的应用)
蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%. 归并法: 看讨论,知道了这道题的经典 ...
- 剑指 Offer——数组中的逆序对
1. 题目 2. 解答 借助于归并排序的分治思想,在每次合并的时候统计逆序对.因为要合并的两个数组都是有序的,如果左半部分数组当前值大于右半部分数组当前值,那么左半部分数组当前值右边的数就都大于右半部 ...
- 剑指offer_数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P. 并将P对1000000007取模的结果输出. 即输出P%100 ...
- 剑指Offer-34.数组中的逆序对(C++/Java)
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%10000 ...
- 剑指Offer34 数组中的逆序对
/************************************************************************* > File Name: 34_Invers ...
- 剑指offer-数组中的逆序对-数组-python
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 剑指 Offer —— 数组中重复的数字
数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一 ...
随机推荐
- Windows下安装mayavi2
由于要使用mayavi2画三维图,但是没有找到二进制包,所以只能安装pythonxy或者canopy之类的版本,后来在http://www.lfd.uci.edu/~gohlke/pythonlibs ...
- python 匹配中文和英文
在处理文本时经常会匹配中文名或者英文word,python中可以在utf-8编码下方便的进行处理. 中文unicode编码范围[\u4e00-\u9fa5] 英文字符编码范围[a-zA-Z] 此时匹配 ...
- 锁(1)-- java锁
前言: 锁分3种:java锁.分布式锁.DB锁 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁 ...
- brew 与 nvm
brew 与 nvm 是两个管理软件工具 今天更新了brew结果brew下安装的软件都找不着了.得重新安装,据说brew已经不再更新了.应该是通过github的吧. 结果得重装node与npm,这两 ...
- LeetCode第[73]题(Java):Set Matrix Zeroes(矩阵置0)
题目:矩阵置0 难度:Easy 题目内容: Given a m x n matrix, if an element is 0, set its entire row and column to 0. ...
- LNMP环境配置SSL证书 lnmp ssl add
.4新增的添加SSL功能 lnmp ssl add 如果需要添加输入 y ,不添加输入 n 回车. 选择了添加SSL会提示 有两个选项,1 选项为使用自己准备好的SSL证书和key. > &g ...
- js来监控复制粘贴
平时我们在复制网页上面代码到控制台调试时,有时会出现复制过来的代码后面加上了一下描述信息(作者.版权等信息),每次需要删除才能运行,所以今天看看怎么能保证我们粘贴的代码不携带这些信息呢? (funct ...
- 《Think in Java》(十七)容器深入研究
阿西吧,这一章好长啊,感觉看了快一个月了吧!JDK 自带的容器框架真是很好很强大啊,这一章看得有点蒙蒙的,接下来还得去看看官方文档啊!
- ctci1.4
; ; ; i < len ; i++) ; +]; ; i < len; i++){ '; } ...
- Dapper 条件语句(Where) 中参数使用
public static List<ECInput> GetECInputList(DateTime beginDate,DateTime endDate,string[] barcod ...