背景  逆序数:也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序.一个排列中所有逆序总数叫做这个排列的逆序数. 定义 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.逆序数为偶数的排列称为偶排列:逆序数为奇数的排列称为奇排列.如2431中,21,43,41…
看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn.net/hustyangju * 题目:分治法求数组最大连续子序列和 * 思路:分解成子问题+合并答案 * 时间复杂度:O(n lgn) * 空间复杂度:O(1) ***************************************/ #include <iostream> using…
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序)   1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度百科: 设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同. 如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数. 例如,数组(3,1,4,5,…
最近在看MIT的算法公开课,讲到分治法的求X的N次方时,只提供了数学思想,于是自己把代码写了下,虽然很简单,还是想动手写一写. int powerN(int x,int n){ if(n==0){ return 1; } int childN = n/2; int result; result = powerN(x,childN); if(n&1){ return result*result; } else{ return result*result*x; } }…
题意 : 有一个n个数的数列且元素都是0~n-1,问你将数列的其中某一个数及其前面的数全部置到后面这种操作中(比如3 2 1 0中选择第二个数倒置就产生1 0 3 2)能产生的最少的逆序数对是多少? 分析 : 首先铁定排除枚举法,直接暴力肯定是超时的.既然这样不妨来找找规律,从第一个数开始,如果我们将第一个数放到末尾,根据逆序数的特点,能够推断出当前总逆序数应该是减少了arr[i]并增加了(n-1)-arr[i] (这里arr[i]代表这个数后面有多少个数小于它),如果细心一点,可以发现不管是从…
题意:给出一组数,然后求它的逆序数 先把这组数离散化,大概就是编上号的意思--- 然后利用树状数组求出每个数前面有多少个数比它小,再通过这个数的位置,就可以求出前面有多少个数比它大了 这一篇讲得很详细 http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html #include<iostream> #include<cstdio> #include<cstring> #include <cm…
问题:设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数.试设计一个O(logn)时间的分治算法,找出X和Y的2n个数的中位数 思想: 对于数组X[0:n-1]和Y[0:n-1]先分别找出X和Y的中位数xa和yb.求中位数的算法是这样的,若n是奇数,即数组X和Y中各有奇数个数字,因为X和Y已经排好序了,所以去数组下标为(n-1)/2处的数即为中位数.若n是偶数,则取(n-1)/2向下取整和向上取整这两个位置的数的平均值作为中位数. 两者进行比较, (1)若xa=yb则…
本随笔只由于时间原因,我就只写写思想了 二维数组最大子数组之和,可以  引用  一维最大子数组之和 的思想一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组a[n][m],找它的 最大子数组之和 1.我们先建立一个新的二维数组b[n][m] 二维数组b[j][k] 存放的是a[j][k](0<=j<n,0<=k<m) 这一点到 a[0][0]  的最大值 2.循环:从a[0][0]开始 以此是 a[0][1]. a[0][2]……a[0][m]…
大致题意:给N个点,求最近点对的距离 d :输出:r = d/2. // Time 2093 ms; Memory 1812 K #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define eps 1e-8 #define maxn 100010 #define sqr(a) ((a)*(a)) using namespace std; int sig(dou…
一组排列就是一组N个整数的数组,其中0~N-1的每个数都只出现一次.两个排列之间的 Kendall tau距离就是在两组排列中相对顺序不同的数对的数目.例如,0 3 1 6 2 5 4和1 0 3 6 4 2 5之间的 Kendall tau距离是4,因为0-1.3-1.2-4.5-4这4对数字在两组排列中的相对顺序不同,但其他数字的相对顺序都是相同的.求两个指定数组的Kendall tau距离的代码如下: // 如果数组itemsB是有序数组,那么问题就转化为统计数组itemsA中的逆序对(参…