剑指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 限制: ...
随机推荐
- HTML5: HTML5 WebSocket
ylbtech-HTML5: HTML5 WebSocket 1.返回顶部 1. HTML5 WebSocket WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 ...
- 7-4 IP思考
内网ip和公网Ip 什么是内网IP: 一些小型企业或者学校,通常都是申请一个固定的IP地址,然后通过IP共享(IP Sharing),使用整个公司或学校的机器都能够访问互联网.而这些企业或学校的机器 ...
- python requests函数封装方法
python requests函数封装方法 上代码 import requests import json """ 封装request请求, 1.post:my_pos ...
- 推荐两款远程管理Linux工具(基于Windows系统)
推荐两款远程管理Linux工具(基于Windows系统) 1.Xshell 百度百科:Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows ...
- CTF中的AWD套路
今年参加了三起CTF比赛,属于初学者,基本除了web其他的不会,但分赛场AWD相对就没什么难度,基本都是技巧性.其中一场进入复赛了,本月底再次比赛(ctf题做的这么渣还能进也是绝了~),参照前人经验补 ...
- java爬取读者文摘杂志
java爬虫入门实战练习 此代码仅用于学习研究 此次练习选择了读者文摘杂志网站进行文章爬取 练习中用到的都只是一些简单的方法,不过过程中复习了输入流输出流的使用以及文件的创建写入等知识,对自己还是有所 ...
- 前端移动端开发总结(Vue)
上下固定,中间滚动布局(FLEX) <div id="app"> <div class="header"></div> &l ...
- python 装饰器的坑
今天研究了下装饰器,添加重试功能遇到了个坑,跟大家分享一下: 代码如下: def re_try(maxtry): print locals() def wrapper(fn): print local ...
- spark window本地运行wordcount错误
在运行本地运行spark或者hadoop代码时可能会遇到一下三种问题 1.Exception in thread "main" java.lang.UnsatisfiedLin ...
- spring 转换器和格式化
Spring总是试图用默认的语言区域将日期输入绑定 到java.util.Date.假如想让Spring使用不同的日期样 式,就需要用一个Converter(转换器)或者 Formatter(格式化) ...