剑指offer——面试题36:数组中的逆序对

Solution1:

20180905整理
参考网址:https://www.nowcoder.com/profile/4474567/codeBookDetail?submissionId=23467046
需对常见的排序思想熟悉。。
20180906更:
这种方法有一个地方不是很好理解,就是在递归调用函数传入参数时。这种操作免去了主动复制的情况,还是solution2好理解一点。。。

class Solution {
public:int InversePairs(vector<int> data) {int length = data.size();if (length <= 0) return 0;vector<int> copy;//生成了一个副本for (int i = 0; i < length; i++)copy.push_back(data[i]);long long count = InversePairsCore(data, copy, 0, length - 1);return count % 1000000007;}long long InversePairsCore(vector<int> &data, vector<int> &copy, int start, int end) {if (start == end) {copy[start] = data[start];return 0;}int length = (end - start)/ 2;//注意在递归时,传入参数的次序不同!!!long long left = InversePairsCore(copy, data, start, start + length);long long right = InversePairsCore(copy, data, start + length + 1, end); //i初始化为前半段最后一个数字的下标int i = start + length;//j初始化为后半段最后一个数字的下标int j = end;int indexcopy = end;long long count = 0;while (i >= start && j >= start + length + 1) {if (data[i] > data[j]) {copy[indexcopy--] = data[i--];//count = count + j - (start + length + 1) + 1;count = count + j - start - length; } elsecopy[indexcopy--] = data[j--];}for(; i >= start; i--)copy[indexcopy--] = data[i];for(; j >= start + length + 1; j--)copy[indexcopy--] = data[j];return left + right + count;}
};

Solution2:

比Solution1稍微好理解一点~~~

class Solution {
public:int InversePairs(vector<int> data) {int length = data.size();if (length <= 0) return 0;vector<int> copy;//生成了一个副本for (int i = 0; i < length; i++)copy.push_back(data[i]);long long count = InversePairsCore(data, copy, 0, length - 1);return count % 1000000007;}long long InversePairsCore(vector<int> &data, vector<int> &copy, int start, int end) {if (start == end) {copy[start] = data[start];return 0;}int mid = (start + end) >> 1;//增加了显示复制,递归时参数不用调换顺序~~long long left = InversePairsCore(data, copy, start, mid);long long right = InversePairsCore(data, copy, mid + 1, end); //i初始化为前半段最后一个数字的下标int i = mid;//j初始化为后半段最后一个数字的下标int j = end;int indexcopy = end;long long count = 0;//此时data[]中的前后两段分别有序,那么利用copy[]做过程变量把两段有序数列归并排序//然后再把copy[]中归并排序后的值逐一赋值到(显示复制的作用)data[]相应位置//这样data[]和copy[]中[start, end]中均为有序数列while (i >= start && j >= mid + 1) {if (data[i] > data[j]) {copy[indexcopy--] = data[i--];//count = count + j - (start + length + 1) + 1;count = count + j - mid; } elsecopy[indexcopy--] = data[j--];}for(; i >= start; i--)copy[indexcopy--] = data[i];for(; j >= mid + 1; j--)copy[indexcopy--] = data[j];//比solution1增加了显示复制的过程,在递归时不用调换顺序了~~~for (int i = start; i <= end; i++)data[i] = copy[i];return left + right + count;}
};

【重点】剑指offer——面试题36:数组中的逆序对相关推荐

  1. 剑指offer面试题[36]-数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  2. 剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)

    1. 题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5限制: 0 ...

  3. 【剑指offer-Java版】36数组中的逆序对

    数组中的逆序对:归并排序的另类应用 数组中的逆序对:给定的数组,如果两个数字中前面一个数字大于后面的一个,那么称为一个逆序对,数组中所有满足此关系的逆序对总数就是这个数组的逆序对 此处的实现并不优雅, ...

  4. 剑指offer面试题[29]-数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  5. 剑指offer面试题[40]-数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 注意原题目要求空间复杂度为0(1). 位运算的具体思路可以参看剑指offer. class So ...

  6. 剑指Offer - 面试题3. 数组中重复的数字(哈希)

    1. 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组 ...

  7. 剑指offer 面试题03. 数组中重复的数字

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  8. 剑指offer面试题[51]-数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  9. 剑指offer面试题03. 数组中重复的数字(Array)

    题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...

  10. 剑指offer面试题39. 数组中出现次数超过一半的数字(数组)(摩尔投票法)

    题目描述 **数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素.** 思路 详见链接 代码 class Solution:def ...

最新文章

  1. 触摸屏校准没反应,启动时出现No raw modules loaded.ts_config:No such file or directory错误的解决
  2. JavaScript高级程序设计之基本概念篇
  3. VS2010断点设置技巧
  4. 电影《长津湖》上映7天票房破26亿元
  5. Linux内核:Gigantic巨页与CMA的结合的PATCH补丁提交
  6. SQL Agent服务无法启动如何破
  7. SketchUp Pro 2022 草图大师设计软件 Mac
  8. 使用LibreOffice的Draw取代Microsoft visio
  9. MATLAB画图详细教程
  10. solidworks2013安装
  11. oracle磁带库清洁带标签,LTO-1/2/3/4/5/6/7/8 Ultrium数据磁带 清洗带 清洁带 磁带标签批发...
  12. 服务器装win7没有硬盘模式,联想电脑BIOS里硬盘的SATA,AHCI模式里面怎么没有I...-联想p310工作站装win7,联想电脑工作站...
  13. 黑暗城堡(最短路径树)
  14. ARPG游戏的战斗系统设计经验分享
  15. Golang之Shadowed Variables(幽灵变量)
  16. 数商云SCM系统供应商准入协同业务场景 | 助力建筑建材企业规范供应商准入环节
  17. Win7解决telnet不是内部或外部命令的方法
  18. 单片机c语言基础知识,c语言必背100代码有哪些?
  19. Linux 密码破解之 John the Ripper
  20. autojs安卓免root实现备份当前文件夹脚本

热门文章

  1. 读EasyPR开发详解实践感想1
  2. ICP算法(Iterative Closest Point迭代最近点算法)
  3. python爬虫结构化_python爬虫获取小区经纬度以及结构化地址
  4. tomcat和idea都占用了8080_详解IDEA 启动tomcat 端口占用原因以及解决方法( 使用debug模式)...
  5. oracle把ascii吗,oracle中ascii函数及to_char函数使用及编码间的转换
  6. typora html代码无效,Typora优化-适合不懂CSS代码的小白
  7. 浏览器崩溃_安装谷歌浏览器后打开网页时出现页面崩溃的解决办法
  8. 最长公共子序列php,动态规划(最长公共子序列LCS)
  9. sybase 事务 超时返回_事务背景介绍(2):MongoDB中的逻辑会话
  10. python类中包含一个特殊的变量、它表示当前对象自身_知到APP教师职场礼仪第七单元章节测试网课答案大学课后答案...