问题描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1: 输入: [7,5,6,4]
输出: 5
  限制: 0 <= 数组长度 <= 50000

这道题和leetcode 315.计算后面较小数字的个数一样。

代码

首先给一个超出时间限制的暴力解法:

class Solution {
public:
int reversePairs(vector<int>& nums) {
int n = nums.size(),i,j,ans=0;
for(i = 0; i < n; ++i)
{
for(j = i+1; j < n; ++j)
{
if(nums[i] > nums[j])
++ans;
}
}
return ans;
}
};

代码

插入排序,很奇怪,还是超出时间限制

class Solution {
public:
int reversePairs(vector<int>& nums) {
int n = nums.size(),i,ans=0,left,right,middle;
vector<int> tmp;//里面的元素
for(i = n-1; i >= 0; --i)
{
left = 0;right = tmp.size();
while(left < right)
{
middle = left + (right - left)/2;
if(nums[i] > tmp[middle])
{
left = middle + 1;
}
else{
right = middle;
}
}
ans += right;
tmp.insert(tmp.begin()+right,nums[i]);
}
return ans;
}
};

代码

归并排序:

class Solution {
public:
int reversePairs(vector<int>& nums) {
if(nums.size() < 2)return 0;
vector<int> tmp(nums.size());
return merge(nums,0,nums.size()-1,tmp);
}
int merge(vector<int>& nums,int start,int end,vector<int>& tmp)
{
if(start >= end)return 0;
int middle = start + (end - start)/2;
int count = merge(nums,start,middle,tmp) + merge(nums,middle+1,end,tmp);
int left = start,right = middle + 1,i= 0;
//vector<int> tmp(end-start+1);//每次都申请空间浪费时间
while(left <= middle && right <= end)
{
if(nums[left] > nums[right])
{
tmp[i++] = nums[left++];
//如果没有下面的计数就是一个归并排序的操作(从大到小),因为左右两边要合并的数组各自都是从大到小排好序的数组了,一旦出现左边当前数比右边当前数大,则也比右边当前数后面的数都要大,都需要计入逆序
count += end-right+1;
}
else{
tmp[i++] = nums[right++];
}
}
while(left <= middle)tmp[i++] = nums[left++];
while(right <= end)tmp[i++] = nums[right++];
for(i = 0; i < end-start+1; ++i)
nums[start+i] = tmp[i];
return count;
}
};

结果

执行用时 :280 ms, 在所有 C++ 提交中击败了78.32%的用户
内存消耗 :44.4 MB, 在所有 C++ 提交中击败了100.00%的用户

《剑指offer》面试题51. 数组中的逆序对的更多相关文章

  1. 剑指Offer - 九度1348 - 数组中的逆序对

    剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...

  2. 剑指offer(35)数组中的逆序对

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

  3. 【剑指Offer】35、数组中的逆序对

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

  4. 【剑指offer】题目36 数组中的逆序对

    数组中任取两个数字,如果前面的数字大于后面的数字称为一个逆序对 如:1,2,1,2,1 有3个逆序对 思路:知道O(N2)肯定是错的.开始想hash,试图找到O(n)的算法,想了很久,找不到.后来想到 ...

  5. 归并排序(归并排序求逆序对数)--16--归并排序--Leetcode面试题51.数组中的逆序对

    面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出 ...

  6. LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...

  7. 力扣Leetcode 面试题51. 数组中的逆序对 - 归并排序

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= ...

  8. 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)

    PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...

  9. 剑指offer 面试题56. 数组中只出现一次的两个数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...

随机推荐

  1. 工作簿合并(Excel代码集团)

    同一文件夹内N个工作簿 ,每个工作簿里N个工作表,最终合并到一个工作表里的代码. 假设每个表格结构相同,第一行为标题,第二行为表头,表头内容固定,行数不固定,列固定14,工作表数量不固定,工作簿数量不 ...

  2. 异步FIFO总结+Verilog实现

    异步FIFO简介 异步FIFO(First In First Out)可以很好解决多比特数据跨时钟域的数据传输与同步问题.异步FIFO的作用就像一个蓄水池,用于调节上下游水量. FIFO FIFO是一 ...

  3. java 输入输出IO 转换流-字符编码

    编码和其产生的问题: 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉字等字符是二进制数转换之后的结果. 按照某种规则,将字符存储到计算机中,称为编码 .反之,将存 ...

  4. git clone报错: Out of memory, malloc failed (tried to allocate 524288000 bytes)

    IDEA 拉取项目报错:Out of memory, malloc failed (tried to allocate 524288000 bytes) 执行 git config --global ...

  5. 【LeetCode】590. N-ary Tree Postorder Traversal 解题报告 (C++&Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 相似题目 参考资料 日期 题目地址:htt ...

  6. 1110 距离之和最小 V3

    1110 距离之和最小 V3 基准时间限制:1 秒 空间限制:131072 KB X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].该点到其他点的带权距离 = 实际距离 * ...

  7. 解决ubuntu突然无法联网问题

    一.问题描述 今天使用笔记本远程办公的时候,突然电脑无法联网了,使用chrome浏览器访问网页出现如下错误 This site can't be reachedwww.baidu.com's serv ...

  8. RabbitMQ学习笔记五:RabbitMQ之优先级消息队列

    RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java ...

  9. Improved Variational Inference with Inverse Autoregressive Flow

    目录 概 主要内容 代码 Kingma D., Salimans T., Jozefowicz R., Chen X., Sutskever I. and Welling M. Improved Va ...

  10. Java Web程序设计笔记 • 【第10章 JSTL标签库】

    全部章节   >>>> 本章目录 10.1 JSTL 概述 10.1.1 JSTL 简介 10.1.1 JSTL 使用 10.1.2 实践练习 10.2 核心标签库 10.2. ...