题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
 
 
分析:利用归并排序的思想,分成2部分,每一部分按照从大到小排序,然后比较左侧的a[i]和右侧的b[j]
 
若a[i]>b[j],那么a[j]大于b[j]~b[right], 产生 right-j+1 组逆序对。
若a[j]<=b[j],不产生逆序对。
 
同时更新数组的从left到right部分,实现其从大到小排序,然后在拿排序号的数组和更大的数组进行排序,同时计算逆序组的数量。
 
class Solution {
private:
int merge(vector<int>& data, int left, int mid, int right)
{
vector<int> tmpVec;
int cnt = ;
int i = left, j = mid + ;
// sort vecotr from big to small
while(i <= mid && j <= right)
{
if(data[i] > data[j])
{
cnt += (right - j + );
tmpVec.push_back(data[i]);
i++;
}
else
{
tmpVec.push_back(data[j]);
j++;
} } while(i <= mid)
{
tmpVec.push_back(data[i]);
i++;
} while(j <= right)
{
tmpVec.push_back(data[j]);
j++;
} //copy tmp data to original data
for(int k = ; k <= (right - left); k++)
{
data[k + left] = tmpVec[k];
}
return cnt;
}
int inversePairs(vector<int>& data, int left, int right)
{
if(data.size() == )
return ;
if(left >= right)
return ; int mid = (left + right)/;
int cnt = ;
cnt += inversePairs(data, left, mid);
cnt += inversePairs(data, mid + , right);
cnt += merge(data, left, mid, right); return cnt;
}
public:
int InversePairs(vector<int> data)
{
return inversePairs(data, , data.size() - );
}
};

[剑指OFFER] 数组中的逆序对的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. PHP通过字符串调用函数

    1. call_user_func function a($b,$c){ echo $b; echo $c; } call_user_func('a', "111","2 ...

  2. MYSQL查询某字段中以逗号分隔的字符串的方法

    首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCH ...

  3. 取消界面的title

    在setContentView(R.layout.activity_main)方法上面添加代码(继承Activity的写法): requestWindowFeature(Window.FEATURE_ ...

  4. Delphi For Android 开发笔记-附:如何Delphi中同时实现Windows、Android版的GetModuleFileName函数

    在Windows中开发DLL时,经常会需要获取当前DLL所在目录以便读取同目录下的其他文件,而目前Delphi在开发android时,其实没多大必要获取,因为整个工程只有一个so文件,而这个so文件也 ...

  5. Delphi XE5 for android 使用 BITMAP STYLE DESIGNER 改变控件背景

    一.BITMAP STYLE DESIGNER 工具集成在IDE开发工具的TOOLS菜单. 使用NEW 新建一个安卓样式.NEW—NEW ANDROID STYLE FOR FIREMONKEY. 这 ...

  6. 在usercontrol中如何使用验证控件CustomValidator 中的客户端验证

    在用户控件中,为一个文本控件添加CustomValidator验证,然后设置CustomValidator 的ClientValidationFunction 属性为客户端的Validate(sour ...

  7. CMD怎样建立文件?

    一.建立空文件的几种方法1.cd.>a.txtcd.表示改变当前目录为当前目录,即等于没改变:而且此命令不会有输出.>表示把命令输出写入到文件.后面跟着a.txt,就表示写入到a.txt. ...

  8. 从零开始学ios开发(一):准备起航

    首先介绍一下自己的背景,本人09年研究生毕业,大学就不介绍了,反正是上海的一所211大学,学的是计算机科学与技术专业,学生时代,从事过ACM,没有什么太大的成就,中国的牛人是在太多,我的水平,估计连高 ...

  9. MVC 局部加载页面的实例

    我们在做MVC 进行某一块的局部刷新,有的使用AJAX 请求,有的使用局部页: 下面我给大家推荐一种使用局部页面实现的这种方式: 第一步: 嵌套视图页 <div id="showAud ...

  10. Android实现KSOAP2访问WebService

    Android实现KSOAP2访问WebService 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 写一个工具类来给主界面使用,作用是使用 ...