剑指offer——54数组中的逆序对
题目描述
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
输入
1,2,3,4,5,6,7,0
输出
7 题解:
这道题有待琢磨。。。
过程总结:
先把数组分隔成子数组,统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。
//最笨的方法
class Solution01 {
public:
int InversePairs(vector<int> data) {
if (data.size() < )return ;
set<int>s;
s.insert(data[]);
int res = ;
for (int i = ; i < data.size(); ++i)
{
if (data[i] < *(s.begin()))
res += s.size();
else if (data[i] > *(--s.end()))
res += ;
else
{
int k = ;
for (auto ptr = s.begin(); ptr != s.end(); ++ptr, ++k)
{
if (*ptr > data[i])
{
res += s.size() - k;
break;
}
}
}
s.insert(data[i]);
}
return res;
}
}; //书本代码,有点乱
class Solution02 {
public:
int InversePairs(vector<int> data) {
if (data.size() < )return ;
vector<int>v;//用来复制的
v = data;
return InversePairsCore(data, v, , data.size() - );
} int InversePairsCore(vector<int>&data, vector<int>©, int start, int end)
{
if (start == end)
{
copy[start] = data[start];
return ;
} int length = (end - start) / ; int left = InversePairsCore(copy, data, start, start + length) % ;
int right = InversePairsCore(copy, data, start + length + , end) % ; // i初始化为前半段最后一个数字的下标
int i = start + length;
// j初始化为后半段最后一个数字的下标
int j = end;
int indexCopy = end;
int count = ;
while (i >= start && j >= start + length + )
{
if (data[i] > data[j])
{
copy[indexCopy--] = data[i--];
count += j - start - length;
if (count >= )//数值过大求余
{
count %= ;
}
}
else
{
copy[indexCopy--] = data[j--];
}
} for (; i >= start; --i)
copy[indexCopy--] = data[i]; for (; j >= start + length + ; --j)
copy[indexCopy--] = data[j]; return (left + right + count) % ;
}
}; //使用归并排序思想
class Solution03 {
private:
int count = ;
public:
int InversePairs(vector<int> data) {
if (data.size() < )return ;
mergeSort(data, , data.size() - );
return count;
}
void mergeSort(vector<int>&data, int L, int R)
{
if (L < R)
{
int M = (L + R) / ;
mergeSort(data, L, M);
mergeSort(data, M + , R);
merge(data, L, M, R);
}
}
void merge(vector<int>&data, int L, int M, int R)
{
vector<int>temp(R - L + );
int t = R - L;
int tL = M;
int tR = R;
while (tL >= L && tR >= M + )
{
if (data[tL] > data[tR])
{
count += tR - M;
temp[t--] = data[tL--];
count %= ;
}
else
temp[t--] = data[tR--];
}
while (tL >= L)
temp[t--] = data[tL--];
while (tR >= M + )
temp[t--] = data[tR--];
for (int i = ; i <= R - L; ++i)
data[L + i] = temp[i];
}
};
剑指offer——54数组中的逆序对的更多相关文章
- 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组
剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...
- 【Java】 剑指offer(51)数组中的逆序对
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成 ...
- 【剑指offer】数组中的逆序对
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/27520535 转载请注明出处:http:// ...
- Go语言实现:【剑指offer】数组中的逆序对
该题目来源于牛客网<剑指offer>专题. 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对10000 ...
- 【剑指offer】数组中的逆序对。C++实现
原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 题目 # 思路 基于归并排序的思想统计逆序对:先把数组分割成子数组,再子数组合并的过程中统计逆序对的数目.统计逆序对 ...
- 剑指Offer 35. 数组中的逆序对 (数组)
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- [剑指Offer] 35.数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 剑指offer:数组中的逆序对
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100 ...
- 微软面试题:剑指 Offer 51. 数组中的逆序对 Hard 出现次数:3
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. 输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: ...
随机推荐
- composer 手动安装及简单使用 windows
1.配置系统变量 Path 计算机->高级系统设置->环境变量->找到系统变量Path 双击 加入 ;php根目录地址:php中ext地址 如 :“;D:\phpStudy ...
- upc组队赛5 Election of Evil【搜索】
Election of Evil 题目描述 Dylan is a corrupt politician trying to steal an election. He has already used ...
- activiti7启动流程实例,动态设置assignee人
package com.zcc.activiti03; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proc ...
- 关于 AfxGetStaticModuleState ()
写MFC的DLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上AFX_MANAGE_STATE (AfxGetStaticModuleState()).一直不明白这样做的 ...
- docker build 时 alpine 无法安装软件问题的解决
使用 alpine 作为 docker 基础镜像时,运行 apk add ..... 遇到如下错误: WARNING: Ignoring http://dl-cdn.alpinelinux.org/a ...
- 发布后台接口报错:could not load file or assembly 'mysql.data,' version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d
本地调试正常,但是服务器上面一直报错:could not load file or assembly 'mysql.data,' version=6.7.4.0, Culture=neutral, P ...
- pygame征途:(一)图片移动反弹
题目大意: 就是弄一张图片在背景画布上移动,然后碰到边界就图片翻转并且反向移动 基本思路: 需要pygame常用的一些常用的函数,然后基本就是在背景画布上blit一张图片,然后移动就是先全刷成背景画布 ...
- Manacher模板(O(n)内求最长回文串长度)
转自:https://segmentfault.com/a/1190000008484167 /* 由于回文分为偶回文(比如 bccb)和奇回文(比如 bcacb),而在处理奇偶问题上会比较繁琐,所以 ...
- 小程序之rpx适配方案
官网文档: 我的理解: rpx是自适应单位 计算方式: 1rpx = 设备屏幕宽度 / 750 注意:750是官网规定 为什么选择iPhone6为标准,作为开发模拟? 因为在iPhone6中,1px ...
- IntelliJ IDEA下载地址
http://www.jetbrains.org/display/IJOS/Download