首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。...即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,...例如7,5,4,6可以划分为两段7,5和4,6两个子数组 在7,5中求出逆序对,因为7大于5所以有1对 在6,4中求出逆序对,因为6大于4所以逆序对再加1,为2 对7,5和6,4进行排序,结果为5,7,...和4,6 设置两个指针分别指向两个子数组中的最大值,p1指向7,p2指向6 比较p1和p2指向的值,如果大于p2,因为p2指向的是最大值,所以第二个子数组中有几个元素就有几对逆序对(当前有两个元素,逆序对加...,所以子数组中没有能和当前p2指向的6构成逆序对的数,将p2指向的值放入辅助数组,并向前移动一位指向4,此时辅助数组内为6,7 继续判断p1(指向5)和p2(指向4),5>4,第二个子数组中只有一个数字

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    数组中的逆序对

    题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。...解法一:暴力法 统计数组中的逆序对的逆序对,可以使用暴力的方法,即顺序扫描整个数组,每扫描到一个数字的时候,逐个与该数字后面的数字比较大小,如果大于后面的某个数字,则形成一个逆序对。...解法二:归并统计 借鉴归并排序的思想,将数组拆分成单个有序的字数组,再进行合并的过程中进行逆序对的统计。时间复杂度为O(nlogn)O(nlogn)。归并排序的实现见:归并排序实现。...因此从整个数组拆分过程中,我们将它不断进行拆分,而拆分得到的两个数组,这样可以想到递归解决问题。 那么加入了逆序对后,如何考虑呢,实际上很简单。...以从最下面的含一个元素的数组,到上层含多个元素的数组都有前后之分,这正好与逆序对性质相符,只要我们找出前面那一个数组中假设L[i] 大于后面一个数组中某个元素R[j],然后就知道前面那个数组在该元素L[

    99910

    Python算法题----逆序列表

    有这样一个列表[1, 2, 3, 4, 5, 6, 7, 8, 9]编程实现该列表逆序排列,将其变为[9, 8, 7, 6, 5, 4, 3, 2, 1] 。    ...题目有了,看看怎么答,逆序排列,只需要将第一个和倒数第一个,第二个和倒数第二个,一直到中间那个位置的数字依次进行交换即可。    ...假设列表为data, 列表长度为len(data)      [1, 2, 3, 4, 5, 6, 7, 8, 9]      0  1  2  3  4  5  6  7  8     从上图的列表和其下标可得出如下结论...            data[i], data[n-1-i] = data[n-1-i], data[i]    # 交换元素     return data 单元测试 测试很重要,尤其是实现复杂功能的代码...,为了避免每次改动都在代码中插一堆print,最好写测试代码,一次投入,回报长远。

    71930

    剑指Offer(三十五)-- 数组中的逆序对

    输入一个数组,求出这个数组中的逆序对的总数。 输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。...第二种方法就是利用分治的思想,在归并排序的基础上稍微改动即可。以数组[8,6,4,2,7,5,3,1]为例: 我们可以发现,其实在合并的过程中,两个有序的数组,可以直接计算出逆序数组的个数。...我们以[8,6,4,2,7,5,3,1],实际上分为[8,6,4,2]和[7,5,3,1],逆序的个数为第一部分[8,6,4,2]中的逆序个数+第二部分[7,5,3,1]中的逆序个数,还有第三部分是[8,6,4,2...]中的元素相对[7,5,3,1]的逆序个数。...如果第二个数组中的元素小于第一个数组中的元素,那么就构成了逆序对,逆序对的个数:如果中间分隔时索引是mid,那么构成逆序对的个数为mid-i+1。

    42910

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

    题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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 ---- 分析 这道题属于最佳单的思路就是对数组建遍历,找到每个元素之后比自己小的元素个数,但这种思路的时间复杂度为 O(...更加高效思路则是利用归并排序的思路进行求解。...count += mid+1 - i github链接: JZ35-数组中的逆序对 ---- C++代码 #include #include using namespace

    64340

    剑指offer 36 数组中的逆序对

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27520535 题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对...输入一个数组,求出这个数组中的逆序对的总数。输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数。其中1 中的逆序对的总数。...理解了思路,就不难了,将数组划分成两个子数组,再将子数组分别划分成两个子数组,统计每个子数组内的逆序对个数,并将其归并排序,再统计两个子数组之间的逆序对个数,并进行归并排序。...];   return count;   }   /* 统计数组中的所有的逆序对 */ long long CountMergePairs(int *arr,int *brr

    67910

    Power BI中如何实现类似Excel中的逆序坐标图?

    小勤:大海,Power BI里面怎么实现逆序刻度图?比如我想分析学生多次考试成绩的名次变化趋势,由于名次数据越小越好,比如第1名要好过第2名,所以,数据小的应该显示在数据大的上方。...大海:对的,目前Power BI还不支持逆序刻度,所以,这个问题如果要在Power BI里实现的话,得想其他办法。 小勤:那怎么办呢?...,但是,因为我们要显示逆序的高低效果,因此,对于堆积柱状图,实际要显示的是:名次的数+辅助名次的图,设置步骤如下。...Step-03:调整名次相关设置 设置名次的柱形图为白色,数据标签的位置为“轴内侧”,结果如下图所示: Step-04:取消辅助名次的数据标签 打开数据标签设置中的“自定义系列...在线M函数快查及系列文章链接(建议收藏在浏览器中): https://app.powerbi.com/view?

    1.8K30

    案例:数组的逆序

    在讲解数组的逆序之前,我们需要了解这么一个需求,就是如何完成数组元素的交换。...那么我们现在的需求是将数组中的两个元素做一下交换,也就是我希望打印arr[0] 得到的是1,打印arr[1] 得到的是0....我们我们定义一个临时的变量temp来充当这个空杯子,然后把可乐倒进空杯子,把雪碧倒进可乐的杯子,再把原来空杯子中的可乐到回到雪碧的杯子中。...好了那么现在我们要做的是这么一件事,将一个数组中的所有元素完成逆序,注意并不是逆序打印,而是真正做到将数组中的所有元素翻转一下。...所以我们其实可以找到一个规律,就是任意一个元素要想实现逆序,需要交换的次数是 arr.length/2 次。这其实也是我们写的循环语句需要执行的次数。

    33420

    golang刷leetcode 技巧(37)数组中的逆序对

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。...就以arr = [7,5,6,4]这个例子来讲解为什么一遍归并排序就看可以解决逆序对的问题。...arrLL中7及其之后的所有数字都大于arrLR中的5, 也就是说7及其之后的所有元素都可以与5组成逆序对, 所以此时7及其之后的所有元素个数(leftLen - i)即我们要的逆序对数,需要添加到结果...sum中。...i); 5 < 6,正常排序,不做处理 7 > 6,说明7及其之后的所有元素都能与6组成逆序对;所以sum += (leftLen - i); 7,正常排序,不作处理 最后sum就是所有逆序对的总个数!

    26020

    数组中的逆序对(归并排序,求逆序对)

    题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。...计算右侧小于当前元素的个数(二叉查找树&二分查找&归并排序逆序数总结) 方法1:后半部出队写入临时数组时,sum + 前半部 没有出来的个数(比后部出队的那个大) 方法2:前半部出队,sum...+ 后半部 已经出队的数量(比出队的那个小),有后续操作,当后半部全部出队了完毕,前半部继续出队,整个后半部分都比剩余的前半部分小。...& arr, int l, int mid, int r) { int i = l, j = mid+1, k = 0; // 方法1:后半部出队,sum+前半部 没有出来的个数...(比后面大的) while(i <= mid && j <= r) { if(arr[i] <= arr[j]) temp[k++] = arr[i++];

    57410
    领券