在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%100000000
来源:互联网 发布:淘宝卖的哈曼卡顿真假 编辑:程序博客网 时间:2024/05/21 13:23
剑指offer:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
思路:链接:归并排序启发得来,把数据分成前后两个数组(递归分到每个数组仅有一个数据项),合并数组,合并时,从后往前遍历,出现前面的数组值array[i]大于后面数组值array[j]时,则,array[i]大于array[start + center + 1] 到array[i]中的所有数。
class Solution {public: int InversePairs(vector<int> data) { int length = data.size(); if(length < 1) return 0; vector<int> copy(data); return InversePairsCore(copy,data,0,length - 1); } int InversePairsCore(vector<int> ©,vector<int> &data,int start, int end){ if(start == end) return 0; int center = (end - start) / 2; int left = InversePairsCore(copy,data,start,start + center)%1000000007; int right = InversePairsCore(copy,data,start + center + 1,end)%1000000007; int i = start + center; int j = end; int copyIndex = end; int count = 0; while(i >= start && j >= start + center + 1){ if(data[i] > data[j]){ copy[copyIndex--] = data[i--]; count += j - start -center; if(count > 1000000007) count %= 1000000007; }else{ copy[copyIndex--] = data[j--]; } } while(i >= start) copy[copyIndex--] = data[i--]; while(j >= start + center + 1) copy[copyIndex--] = data[j--]; for(int k = start; k <= end; k++) data[k] = copy[k]; return (left + right + count)%1000000007; }
阅读全文
0 0
- 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%100000000
- 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%100000000
- 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字构成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数
- 输入一个数组,求出这个数组的逆序对的总数
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 输入一个递增的数组和一个数字s,找出数组中任意两个数使他们的和正好是这个数字s,如果有任意多对数字的和为s,输出任意一堆数字即可,例如,输入数组[1,2,4,7,11,15]和数字
- 微软100道算法题-----输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对
- 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,
- 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132
- java 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 【剑指offer24】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 《剑指Offer》输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- ubuntu 16.04 安装openCv3.1
- tomcat正常启动访问页面是空白页解决办法
- bzoj1942: [Ceoi2007]Ministry
- C++定义一个只能在堆上(栈上)生成对象的类
- HDU4691用RMQ求所有字符串后缀的最长公共前缀
- 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%100000000
- POJ1611
- 单节点nginx环境搭建
- Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
- (一)Linux中vi的复制粘贴命令
- 扫雷
- 第一章、flume的介绍及原理
- 『DeepLearning』tensorFlow搭建CNN-mnist上手
- Java 设计模式_外观模式