【剑指offer】数组中的逆序对

# @left part: [start, mid]
# @right part: (mid, end]
def merge(data, start, mid, end):
	if mid < start or end < mid:
		return 0
	reverse = 0
	'''
	 	@ for start, it play as the start index of left part, and mid
		@ play as the end index of left part;
		@ mid + 1 (st2) play as the start index of right part, and end
		@ play as the end index of right part.
	'''
	#@ start of right part
	st2 = mid + 1
	while start <= mid and st2 <= end:
		if data[start] > data[st2]:
			# move data[st2] to start, and data[start, - 1]
			# move back by 1
			data.insert(start, data.pop(st2))
			reverse += st2 - start
			# [start, mid] move back by one, so start = start + 1
			# and mid = mid + 1
			start += 1
			mid += 1
			# same as start & mid, move back by 1
			st2 += 1
		else:
			# no insert or move, so start = start + 1
			start += 1
	return reverse

def mergeSortWithCount(data, start, end):
	#just one item or Node, return dirctly
	if len(data) <= 1 or end <= start:
		return 0
	mid = (start + end) >> 1

	#@ reversepair number of left part
	left = mergeSortWithCount(data, start, mid)

	# reversepair number of right part
	right = mergeSortWithCount(data, mid + 1, end)

	# toal count of reverse pair = left + right + {merger(left, right)}
	return merge(data, start, mid, end) + left + right
	

这个题,还可以通过线段树来实现,有兴趣的可以找一些线段树的题练一练。下面的链接是我学习线段树的第一个博客。

http://www.notonlysuccess.com/index.php/segment-tree/

【剑指offer】数组中的逆序对,布布扣,bubuko.com

时间: 2024-12-15 07:14:27

【剑指offer】数组中的逆序对的相关文章

剑指offer 数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入 1,2,3,4,5,6,7,0 输出 7 思路:归并排序的思路.具体参考剑指

剑指offer——数组中的逆序对

数组中的逆序对 **(不会)数据结构--小和问题 逆序对问题 原文地址:https://www.cnblogs.com/SkyeAngel/p/8978980.html

剑指offer_数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P. 并将P对1000000007取模的结果输出. 即输出P%1000000007 本题采用归并排序,归并排序算法我在前一篇博客里写到过,在那个基础上进行修改即可!(强烈建议先理解归并排序的具体算法后,再来做此题) public class Solution36 { private int count = 0; //记录次数 private int[] copy ;

剑指Offer34 数组中的逆序对

1 /************************************************************************* 2 > File Name: 34_InversePairsInArray.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月02日 星期五 20时05分05秒 6 *******************************

剑指offer-数组中的逆序对-数组-python

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 class Solution: def InversePairs(self, data):

剑指 Offer —— 数组中重复的数字

数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 7 的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字 2 或者 3.(牛课网这里弄成「那么对应的输出是第一个重复的数字 2」了) A 简单实现思路 借助外部数组 b,原数组中的数字记为外部数组的下标,外部数组的值来存储这个数字出现的次数.原数组中

python剑指offer数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路: 两种思路.第一种思路,出现次数超过一半的数字,不管如何,必然这个数字位于数组中间的位置,因此可以采用类似于快排的划分的方法,找到位于数组中间的位置的数字,然后在顺序检索是否这个数字出现次数超过一半.第二种思路根据数组的特点,出现次数超过一半的数,他出现的次数比其他数字出

剑指offer——数组中出现次数超过一半的数字(c++)

题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路一遍历数组是保存两个值:一个是数字中的一个数字,另一个是次数.当遍历到下一个数字的时候,如果下一个数字和之前保存的数字相等,则次数加1:如果不同,则次数减1:如果次数为零,那么我们需要保存下一个数字,并把次数设置为1.由于我们要找的数字出现的次数比其他所有数字出现的次数之和还

剑指offer 数组中出现超过一半的数字

class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { if(numbers.empty()){ return 0; } if(numbers.size() == 1){ return numbers[0]; } int len = (int)numbers.size(); float target = len/2.0; map<int, int> m; for(int num: nu

剑指offer (36) 数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面一个数字,则这两个数字组成一个逆序对 题解分析: 首先应该想到很简单的一种解法,顺序遍历数组,对每个数,逐个比较该数字和其以后的数字,T(n) = O(n^2) (1)总体的意思就是将数组分成两段,首先求段内的逆序对数量,比如下面两段代码就是求左右两端数组段内的逆序对数量 count += Merge(data, temp, first, mid);//找左半段的逆序对数目 count += Merge(data, temp, mid + 1, e