剑指offer:数组中的逆序对
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
解题思路
- 暴力超时
class Solution {
public:int InversePairs(vector<int> data) {if(data.size()<=1) return 0;int cnt=0;for(int i=0; i<data.size(); i++){for(int j=i+1; j<data.size(); j++){if(data[j]<data[i]) cnt++;}}return cnt%1000000007;}
};
剑指offer的解法:
class Solution {
public:int InversePairs(vector<int> data) {int length=data.size();if(length<=0)return 0;//vector<int> copy=new vector<int>[length];vector<int> copy;for(int i=0;i<length;i++)copy.push_back(data[i]);long long count=InversePairsCore(data,copy,0,length-1);//delete[]copy;return count%1000000007;}long long InversePairsCore(vector<int> &data,vector<int> ©,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); int i=start+length;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; //count=count+j-(start+length+1)+1;}else{copy[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;}
};
剑指offer:数组中的逆序对相关推荐
- 剑指offer 数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 剑指Offer_35_数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 2021-09-03剑指Offer51.数组中的逆序对
class Solution {int[] nums, tmp;//表示未分配长度的数组指针?//java的默认权限是共有还是私有?public int reversePairs(int[] nums ...
- 剑指offer 数组中的逆数对
链接:https://www.nowcoder.com/profile/8740530/codeBookDetail?submissionId=9156674 来源:牛客网class Solution ...
- 剑指offer35——数组中的逆数对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 一种直观的思路是通过暴力破解的方法,时间复杂度为O(N*N).除此以 ...
- 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 剑指offer:数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- [剑指offer] 数组中只出现一次的数字
本文首发于我的个人博客:尾尾部落 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. 解题思路 法一:大家都能想到的HashMap法 法二:异或法 ...
- python剑指offer数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 【排序】剑指offer:数组中重复的数字
对数组进行排序,然后遍历判断,如果两个数相等,那么这两个数一定相邻 代码: class Solution { public:int duplicate(vector<int>& n ...
最新文章
- CSS 文字,边框实现从左至右颜色渐变
- 在shell脚本中没有换行符的#39;echo#39;
- s3c2440地址分配
- linux 3.0.8 alsa数据流程分析
- OpenJudge NOI 1.5 15:银行利息
- linux xmind无法运行,linux安装xmind的方法步骤
- pandas数据聚合与分组
- IOS开发(63)之GCD执行延迟操作
- Kubernetes的系统架构与设计理念
- String特殊值的判断方式
- oracle——监听(三、监听配置)
- 试题12 交叉排序(小-大,大-小)
- 微电子电路——例题总结
- linux vi编辑(20160628)
- 一些排序算法的Python实现
- Linux 下的桌面指针时钟
- why-not 和 why 问题简介
- java.sql.SQLException: No database selected
- MC33063电源啸叫
- 计算机关机更改域用户登录,计算机怎么退域和重新加域?
热门文章
- [LeetCode] Restore IP Addresses 复原IP地址
- iOS---Objective-C: +load vs +initialize
- ionic2.0禁止横屏模式
- CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)
- Ext JS 6正式版的GPL版本下载地址
- Linux大文件传输(转)
- CentOS安装配置之基本
- 丰富多彩的Android onTouch事件
- 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了)
- .condarc文件是什么