剑指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 限制: ...
随机推荐
- python作业/练习/实战:1、简单登录脚本
作业要求 写一个登陆的小程序 username = xiaoming passwd = 123456 1.输入账号密码,输入正确就登陆成功, 提示:欢迎xxxx登陆,今天的日期是xxx. 2.输入错误 ...
- git for windows 2.1版本git bash下git log乱码修复
git bash,输入以下命令git config --global i18n.logoutputencoding utf-8git config quotepath false关闭git bash, ...
- 39-python基础-python3-字典常用方法-get()
在访问一个键的值之前,检查该键是否存在于字典中,这很麻烦. 好在,字典有一个 get()方法,它有两个参数:要取得其值的键,以及如果该键不存在时,返回的备用值. dict.get(键,默认值) 实例- ...
- Permission denied
记录在一次启动tomcat时提示:Permission denied 信息. 解释一下Permission denied的意思-没有权限 解决办法: sudo chmod -R 777 某一目录其中- ...
- echarts 给formatter文字添加不同颜色
legend: { x : 'center', y : 'bottom', icon: "circle", itemWidth: 8, // 设置宽度 itemHeight: 8, ...
- 深入Dagger:自定义AutoValue
前言 上一篇文章介绍了JavaPoet的原理和使用,这里在介绍一下AutoValue的原理,并模仿自定义实现一个AutoValue. AutoValue的是Google为了实现ValueClass设计 ...
- 【最新】docker 安装elasticsearch + kibana步骤【第一篇_elasticsearch】
最近在用docker 安装elasticsearch + kibana 遇到了很多坑,最后成功安装elasticsearch + kibana (6.8.1)版本 安装了一下午,现总结过程中遇到 ...
- elasticsearch启动常见问题
原文:https://blog.csdn.net/qq_22211217/article/details/80740873 一.Exception in thread "main" ...
- Nginx反向代理与负载均衡应用实践(一)
Nginx反向代理与负载均衡应用实践(一) 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App ...
- 牛客练习赛48 C,D,E
C 小w的糖果 题意:3种操作,第一种是使pos右边的数全部+1,第二种是pos右边的数依次+k(k从1开始递增),第三种是pos右边的数依次+k^2(k从1开始递增). 解法:第一种我们很容易想到差 ...