【剑指offer】数组中的逆序对,C++实现
原创博文,转载请注明出处!
本题牛客网地址
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> ©, 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++实现的更多相关文章
- [剑指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 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一 ...
随机推荐
- Poj 1755Triathlon 未Ac,先mark
地址:http://poj.org/problem?id=1755 题目: Triathlon Time Limit: 1000MS Memory Limit: 10000K Total Subm ...
- 大数据生态,哪些框架需要全部启动,哪些只启动master,仅为汇总
主从,只需要在master节点启动 hadoop hbase 单机启动 hive 其他,需要启动每个节点 zookeeper kafka flume presto
- python3爬虫全国地址信息
PHP方式写的一团糟所以就用python3重写了一遍,所以因为第二次写了,思路也更清晰了些. 提醒:可能会有502的错误,所以做了异常以及数据库事务处理,暂时没有想到更好的优化方法,所以就先这样吧.待 ...
- sublime使用sublimelint-luacheck屏蔽指定警告
在成功安装SublimeLinter-lua与luacheck以后,如果没有语法error,则会进行警告提示. 如下图 waring: line contains trailing whitespac ...
- window下安裝redis服務
一.下载windows版本的Redis github下载地址:https://github.com/MicrosoftArchive/redis/releases/tag/win-3.2.100 ...
- jedis客户端,取redis服务的值
package com.common.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
- git原理学习
http://git.oschina.net/progit/ 这一点值得牢记:Git 会把工作目录的内容恢复为检出某分支时它所指向的那个提交对象的快照.它会自动添加.删除和修改文件以确保目录的内容 ...
- Nodejs WEB开发常用库和框架
我在Nodejs的体系里也算泡了很久了,的确非常喜欢javascript和Nodejs. 在我看来,用nodejs做web开发有以下几个优点: Javascript作为一个语法异常简单的脚本语言,约束 ...
- JAVA实现IP地址解析
转载至:http://blog.csdn.net/dragontang/article/details/4151660 http://www.iteye.com/topic/340548#