寻找无序数组中的全部降序对
来源:互联网 发布:淘宝号为什么被冻结 编辑:程序博客网 时间:2024/06/15 02:09
点:巧用归并排序思维
题意:如数组[10,3,15,11,13,1,5,19,2,5,8,7,23,20],寻找其中全部的降序对,所谓降序对,就是数组中,某个位置靠前的数字比某个位置靠后的数字大,比如10在3的前面但是比3大,那么[10,3]就是一个降序对,目的就是寻找全部的降序对。
剑指offer面试题36
思路:非常直观的办法是,从第一个数开始,遍历其后面的数,相当于冒泡排序。这个时间复杂度为O(N)
这个办法虽然可行,但在面试时肯定不行的。
利用归并排序特点,形成一个个的小组,再不断判断是否形成了逆序对即可。
下面是一个简单的解法。不适用仅统计逆序对个数。
代码:
#include <iostream>#include <random>void Find_reverse_pairs (int *data, int st1, int ed1, int st2, int ed2) { for (int i = st1; i <= ed1; i++) { for (int j = st2; j <= ed2; j++) { if (data[i] > data[j]) { std::cout << "detect " << data[i] << "," << data[j] << "\t"; } } }}void Find (int *data, int size, int st, int ed) { if (st == ed) { return; } int mid = (st + ed)/2; Find(data, size, st, mid); Find(data, size, mid + 1, ed); Find_reverse_pairs(data, st, mid, mid + 1, ed);}void find_reverse_pair_in_array (int *data, int size) { Find(data, size, 0, size - 1); std::cout << std::endl;} int main () { std::random_device rd; int data[10], tmp[10]; for (int i = 0; i < 10; i++) { int cur = rd() % 100; data[i] = cur; tmp[i] = cur; std::cout << cur << "\t"; } std::cout << std::endl; find_reverse_pair_in_array(tmp, sizeof(data)/sizeof(data[0])); return 0;}
阅读全文
0 0
- 寻找无序数组中的全部降序对
- 寻找无序数组中的第K大数
- 寻找无序数组中的第K大数
- 寻找无序数组中的第K大数
- 寻找数组中的逆序对
- 对数组降序排列
- 寻找无序数组的中位数
- 对一个二维数组中的某个值进行降序排行
- 冒泡排序--对数组中的元素进行降序排列
- 寻找无序数组中的第K大数和前K大数
- c++ 对数组中的10个元素进行升序和降序排序
- 对数组中的自定义的类型根据姓名,年龄排序(升序, 降序)sortedArrayUsingSelector
- 实现对数组的降序排序
- 对数组进行升序和降序排序
- 寻找无序互异数组中丢失的数
- 无序数组寻找两个数为指定和X
- 寻找单个无序数组中第K小的数字
- 寻找数组中无序的部分,并返回索引。
- 全排列
- (多校联萌)-zzu-2175: GJJ的日常之再游戏
- 设计模式之单一职责原理
- 2017年8月18日训练日记
- easyui单元格格式化
- 寻找无序数组中的全部降序对
- hdu1403(后缀数组求lcs模板)
- const
- 外部过滤器,程序和命令--时间/日期 命令
- 树状数组(一维)
- 一维数组初始化
- (HDU
- oracle 表查询(经典例子)--2017-08-19
- 暑假总结第17天