博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指Offer 51 数组中的逆序对
阅读量:6267 次
发布时间:2019-06-22

本文共 2533 字,大约阅读时间需要 8 分钟。

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

1 # -*- coding:utf-8 -*- 2 class Solution: 3     def __init__(self): 4         self.cnt = 0 5         self.tmp = [] 6          7     def InversePairs(self, data): 8         n = len(data) 9         self.tmp =[0] * n10         self.mergeSort(data,0,n-1)11         return self.cnt % 100000000712         13     def mergeSort(self,nums,l,h):14         if h - l < 1:15             return16         m = l + (h - l) // 217         self.mergeSort(nums,l,m)18         self.mergeSort(nums,m+1,h)19         self.merge(nums,l,m,h)20         21     def merge(self,nums,l,m,h):22         i,j,k = l,m+1,l23         while i <= m or j <= h:24             if i > m:25                 self.tmp[k] = nums[j]26                 j += 127             elif j > h:28                 self.tmp[k] = nums[i]29                 i += 130             elif nums[i] <= nums[j]:31                 self.tmp[k] = nums[i]32                 i += 133             else:34                 self.tmp[k] = nums[j]35                 j += 136                 self.cnt += m - i + 137             k += 138         k = l39         while k <= h:40             nums[k] = self.tmp[k]41             k += 142         # write code here

本题超时,据说是oj对python的判断有问题。

 

下面是参考的java实现可以提交:

1 public class Solution { 2     private long cnt = 0; 3     private int[] tmp;  // 在这里声明辅助数组,而不是在 merge() 递归函数中声明 4  5     public int InversePairs(int[] nums) { 6         tmp = new int[nums.length]; 7         mergeSort(nums, 0, nums.length - 1); 8         return (int) (cnt % 1000000007); 9     }10 11     private void mergeSort(int[] nums, int l, int h) {12         if (h - l < 1)13             return;14         int m = l + (h - l) / 2;15         mergeSort(nums, l, m);16         mergeSort(nums, m + 1, h);17         merge(nums, l, m, h);18     }19 20     private void merge(int[] nums, int l, int m, int h) {21         int i = l, j = m + 1, k = l;22         while (i <= m || j <= h) {23             if (i > m)24                 tmp[k] = nums[j++];25             else if (j > h)26                 tmp[k] = nums[i++];27             else if (nums[i] <= nums[j])28                 tmp[k] = nums[i++];29             else {30                 tmp[k] = nums[j++];31                 this.cnt += m - i + 1;  // nums[i] > nums[j],说明 nums[i...mid] 都大于 nums[j]32         }33         k++;34     }35     for (k = l; k <= h; k++)36         nums[k] = tmp[k];37     }38 }

 

转载于:https://www.cnblogs.com/asenyang/p/11023306.html

你可能感兴趣的文章
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>
操作系统真实的虚拟内存是什么样的(一)
查看>>
hadoop、hbase、zookeeper集群搭建
查看>>
python中一切皆对象------类的基础(五)
查看>>
modprobe
查看>>
android中用ExpandableListView实现三级扩展列表
查看>>
%Error opening tftp://255.255.255.255/cisconet.cfg
查看>>
java读取excel、txt 文件内容,传到、显示到另一个页面的文本框里面。
查看>>
《从零开始学Swift》学习笔记(Day 51)——扩展构造函数
查看>>
python多线程队列安全
查看>>
[汇编语言学习笔记][第四章第一个程序的编写]
查看>>
android 打开各种文件(setDataAndType)转:
查看>>
补交:最最原始的第一次作业(当时没有选上课,所以不知道)
查看>>
Vue实例初始化的选项配置对象详解
查看>>
PLM产品技术的发展趋势 来源:e-works 作者:清软英泰 党伟升 罗先海 耿坤瑛
查看>>
vue part3.3 小案例ajax (axios) 及页面异步显示
查看>>
软件测试(二)之 Failure, Error & Fault
查看>>
浅谈MVC3自定义分页
查看>>
.net中ashx文件有什么用?功能有那些,一般用在什么情况下?
查看>>