【剑指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 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一 ...
随机推荐
- JAVA基础补漏--文件读取
public class Test2 { public static void main(String[] args) throws IOException { FileInputStream fis ...
- Flume在企业大数据仓库架构中位置及功能
Flume在企业大数据仓库架构中位置及功能 hadoop 数据仓库 flume 数据仓库架构 1.如下图所示,外部数据中,关系型数据库导入到HDFS用sqoop,由Nginx产生的文件实时监控用Flu ...
- Chrome好用的插件:Wappalyzer 检测网站使用的技术
Chrome好用的插件:Wappalyzer 检测网站使用的技术 Wappalyzer是一款能够分析目标网站所采用的平台架构.网站环境.服务器配置环境.javascript框架.编程语言等参数的chr ...
- Web前端可以转行做游戏吗?
作者:ManfredHu 链接:http://www.manfredhu.com/2018/03/15/31-laya-game-tips/index.html 声明:版权所有,转载请保留本段信息,谢 ...
- 使用IP spoofer 功能
有个问题请教:使用IP spoofer 功能后,很多vuser都会挂掉,这个怎么解决呢? LR
- Python实现单链表
定义链表结构: class ListNode: def __init__(self, x): self.val = x self.next = None 输出该链表l1的元素: while l1: p ...
- 事后调试.ZC资料
1.查了一下,Delphi 程序 可以生成 map文件,可以用来 根据崩溃的内存报错 定位出错的代码位置 2.但是,Delphi程序 无法再崩溃的时候 生成dump文件 (这个不一定,研究了再说.记得 ...
- BinLog日志
一.概述 binlog 二进制日志文件,可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事 ...
- Oracle 冷备份详解【实战案例】
Oracle 冷备份详解 --准备工作 select * from v$database; select file_name from dba_data_files; create tablespac ...
- oracle 11g各种下载地址
Oracle Database 11g Release 2 Standard Edition and Enterprise Edition Software Downloadsoracle 数据库 1 ...