首页 > 其他分享 >剑指offer 数组中的逆序对(归并排序)

剑指offer 数组中的逆序对(归并排序)

时间:2022-12-12 19:34:43浏览次数:63  
标签:归并 offer int while lpoi ans arrmv 逆序


​剑指 Offer 51. 数组中的逆序对​

难度困难176

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

 

示例 1:


输入: [7,5,6,4] 输出: 5


解题思路:

统计逆序对时候,答案的贡献以左半部分为基准。

class Solution {
public:
vector<int> arrmv;
int ans;
void merge_sort(int l,int r){
if(l>=r)return;
int m = l+(r-l)/2;
merge_sort(l,m);
merge_sort(m+1,r);
queue<int> q;
int lpoi=l;
int rpoi=m+1;
while(lpoi<=m && rpoi<=r){
while(lpoi<=m && arrmv[lpoi]<=arrmv[rpoi])q.push(arrmv[lpoi++]),ans+=(rpoi-(m+1));
while(lpoi<=m && rpoi<=r && arrmv[rpoi]<arrmv[lpoi])q.push(arrmv[rpoi++]);
}
while(lpoi<=m){
q.push(arrmv[lpoi++]);
ans+=(r-(m+1)+1);
}
while(rpoi<=r)q.push(arrmv[rpoi++]);
int poi=l;
while(q.size()){
arrmv[poi++]=q.front();
q.pop();
}
}
int reversePairs(vector<int>& nums) {
ans=0;
arrmv=nums;
merge_sort(0,(int)arrmv.size()-1);
return ans;
}
};

 

标签:归并,offer,int,while,lpoi,ans,arrmv,逆序
From: https://blog.51cto.com/u_15910522/5931540

相关文章

  • 剑指offer 数据流中的中位数(思维,堆)
    题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值......
  • 剑指offer 字符流中第一个不重复的字符(思维,队列)
    题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“g......
  • 剑指offer 二叉搜索树的第k个结点(二叉搜索树的中序遍历)
    题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如,(5,3,7,2,4,6,8)  中,按结点数值大小顺序第三小结点的值为4。解题思路:我们知道二叉搜索树的中序遍历就是排序好的数列......
  • 剑指offer 序列化二叉树
    题目描述请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可......
  • 剑指offer 对称的二叉树(思维)
    题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路:正规的解法是传入两个节点,然后判断它们是不......
  • 归并排序
    排序是非常常见且常用的算法,这次的排序算法是归并排序见例题如下:本题要求实现二路归并排序中的归并操作,待排序列的长度1<=n<=1000。函数接口定义:voidMerge(SqListL,i......
  • 归并排序-Python
    归并排序的时间复杂度O(nlogn),空间复杂度为O(n)首先我们先假设有两个有序数组,我们去进行一次归并 用代码实现defmerge(li:list,start:int,mid:int,end:int):......
  • function~数组逆序存放
    题目描述将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。 输入输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每两......
  • 归并排序应用——剑指 Offer 51. 数组中的逆序对
    (文章目录)题目1.在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例1:输入:[7,5,6......
  • 算法学习笔记(2)——归并排序
    归并排序归并排序的思想是基于分治法,其思路是:将待排序区间平分成左右两半,左右两侧分别递归地做归并排序。将这两个有序的区间合并(每次落一个较小的下来),就将这个区间排......