牛客网上的剑指offer编程题

题目:

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

冒泡思想

看到这道题,首先想到的是冒泡排序法,也就是两两比较,时间复杂度为(n^2),这里对冒泡排序进行一定改进:某次比较过程中,如果没有两个元素交换位置,则说明已经排好序,退出循环。

def test(array):t=0for i in range(len(array)-1,0,-1):flag=Falsefor j in range(i):if array[j]>array[j+1]:array[j],array[j+1]=array[j+1],array[j]t+=1flag=Trueif not flag:breakreturn t%(2*(10**5))

然而因为时间复杂度太高,通过不了。。。

归并思想

根绝归并排序的原理,可得到时间复杂度为O(n*logn)的方法,也就是在归并排序法的基础上添加一行代码:cout=+len(left)-l

class Solution:def InversePairs(self, data):#冒牌排序法,时间复杂度太高,时间复杂度为O(n^2)。采用归并排序的思想,时间复杂度为O(nlogn)global countcount=0def A(array):global countif len(array)<=1:return arrayk=int(len(array)/2)left=A(array[:k])right=A(array[k:])l=0r=0result=[]while l<len(left) and r<len(right):if left[l]<right[r]:result.append(left[l])l+=1else:result.append(right[r])r+=1count+=len(left)-lresult+=left[l:]result+=right[r:]return resultA(data)return count%1000000007

然后还是通过不了,其他语言的归并版本可以,感觉python收到了针对。。。

最后网上还看到一个更加简洁(牛逼)的方法:

  • 先将原序列排序,然后从排完序的数组中取出最小的,它在原数组中的位置表示有多少比它大的数在它前面,每取出一个在原数组中删除该元素,保证后面取出的元素在原数组中是最小的,这样其位置才能表示有多少比它大的数在它前面,即逆序对数。
class Solution:def InversePairs(self, data):count = 0copy = []for i in data:copy.append(i)copy.sort()for i in range(len(copy)):count += data.index(copy[i])data.remove(copy[i])return count%1000000007
a=[1,2,3,4,5,6,7,0]
Solution().InversePairs(a)

数组中的逆序对python相关推荐

  1. 输入一个数组,求出这个数组中的逆序对的总数

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

  2. 剑指offer:数组中的逆序对

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

  3. C++求数组中的逆序对

    C++求数组中的逆序对. 如果在数组中的两个数字如果前面的一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数 #include<iostream> ...

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

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

  5. 牛客(35)数组中的逆序对

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

  6. 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方

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

  7. c语言数组求逆序对,LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...

  8. 剑指Offer_35_数组中的逆序对

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

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

    题目: 数组中的逆序对 链接: https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId= ...

最新文章

  1. 高档名片设计:12款专业的名片设计欣赏
  2. 【注水功率分配】注水功率分配算法的MATLAB仿真
  3. C# Combobox联动
  4. Java的TreeMap统计单词数量
  5. 简单json语句转化为map保存
  6. Java虚拟机对synchronized的优化
  7. eth显卡算力2020最新排行_最新三大主流币IPFS比特币ETH挖矿全网算力动态速递单周报(12.3更新)...
  8. vue 图片拖动加载 类似于地图_前端性能优化之图片懒加载(附vue自定义指令)...
  9. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈
  10. oracle ogg11.2.0.3,ogg在oracle database 11.2.0.3上还是谨慎使用集成捕捉模式
  11. 取消xp开机默认登陆账户
  12. Gram-Schmidt正交化
  13. linux中posix共享内存,Linux 共享内存(POSIX)
  14. java开发spc分析软件,SPC、五大工具带你深入实战......OMG,收藏!
  15. acm答案java_java-ACM详解(6)——栈 有答案版 全国软件设计大赛 参考试题
  16. KindEditor上传图片word
  17. Houdini10:灯光
  18. 01,HelloWorld入门程序
  19. SXF2019IP段合并
  20. [RFID]射频识别技术基础

热门文章

  1. MySQL多表连接查询——等值连接、非等值连接和自连接
  2. FJNU2019级第二场排位赛D题Nim题解
  3. flask框架----介绍
  4. JavaScript 解构赋值
  5. Springboot企业财务发票管理系统毕业设计源码231105
  6. FFmpeg unable to find a suitable output format for
  7. 我们月刊最受欢迎的开源项目 Top10(2020 年)
  8. 新计算机设置,请问新电脑怎样设置BIOS????
  9. “回车”、“换行”浅谈
  10. Exception in thread main com.alibaba.fastjson.JSONException: create asm serializer error