vb.net中递归退到最外层_数组中的逆序对

513bdfc4c068a2681753f5825a18465f.png

题目描述

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

输入描述:

题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4 
对于%75的数据,size<=10^5 
对于%100的数据,size<=2*10^5

示例:

输入:
{1, 2, 3, 4, 5, 6, 7, 0}
返回值:
7

解题思路及代码

方法一:暴力列举

暴力列举所有的数对,然后判断是否逆序。

具体方法是:按住一个arr[i], 依次判断{i+1 ... n-1]是否满足条件。n为数组的大小。

代码如下:

class Solution {
private:const int kmod = 1000000007;
public:int InversePairs(vector<int> data) {int ret = 0;int n = data.size();for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (data[i] > data[j]) {ret += 1;ret %= kmod;}}}return ret;}
};

对于10^5数据,O(N^2)算法显然超时。

时间复杂度:O(N^2)

空间复杂度:O(1)

方法二:归并排序思想

对数组一边进行归并排序,一边计算逆序对。

首先明确归并排序的过程:

  • 递归划分整个区间为基本相等的左右两个区间
  • 合并两个有序区间

归并排序的代码:

// 合并过程
void merge__(vector<int> &arr, int l, int mid, int r) {// 在这个地方创建额外空间,是一种不好的做法,更好的做法是:直接在最外层开辟一个足够大的数组,然后传引用到函数。vector<int> tmp(r - l + 1);int i = l, j = mid + 1, k = 0;while (i <= mid && j <= r) {if (arr[i] >= arr[j]) {tmp[k++] = arr[j++];}else {tmp[k++] = arr[i++];}}while (i <= mid) {tmp[k++] = arr[i++];}while (j <= r) {tmp[k++] = arr[j++];}for (k = 0, i = l; i <= r; ++i, ++k) {arr[i] = tmp[k];}
}// 递归划分过程
void merge_sort__(vector<int> &arr, int l, int r) {// 只有一个数字,则停止划分if (l >= r) {return;}int mid = l + ((r - l) >> 1);merge_sort__(arr, l, mid);merge_sort__(arr, mid + 1, r);// 合并两个有序区间merge__(arr, l, mid, r);
}
// 要排序的数组 arr
void merge_sort(vector<int>& arr) {merge_sort__(arr, 0, arr.size() - 1);
}

本题中如何利用归并排序的思想?

如果两个区间为[4, 3] 和[1, 2]

那么逆序数为(4,1),(4,2),(3,1),(3,2),同样的如果区间变为有序,比如[3,4] 和 [1,2]的结果是一样的,也就是说区间有序和无序结果是一样的。

但是如果区间有序会有什么好处吗?

当然,如果区间有序,比如[3,4] 和 [1,2]

如果3 > 1, 显然3后面的所有数都是大于1, 这里为 4 > 1, 明白其中的奥秘了吧。所以我们可以在合并的时候利用这个规则。

代码如下:

class Solution {
private:const int kmod = 1000000007;
public:int InversePairs(vector<int> data) {int ret = 0;// 在最外层开辟数组vector<int> tmp(data.size());merge_sort__(data, tmp, 0, data.size() - 1, ret);return ret;}void merge_sort__(vector<int> &arr, vector<int> &tmp, int l, int r, int &ret) {if (l >= r) {return;}int mid = l + ((r - l) >> 1);merge_sort__(arr, tmp, l, mid, ret);merge_sort__(arr, tmp, mid + 1, r, ret);merge__(arr, tmp, l, mid, r, ret);}void merge__(vector<int> &arr, vector<int> &tmp, int l, int mid, int r, int &ret) {int i = l, j = mid + 1, k = 0;while (i <= mid && j <= r) {if (arr[i] > arr[j]) {tmp[k++] = arr[j++];// 奥妙之处ret += (mid - i + 1);ret %= kmod;}else {tmp[k++] = arr[i++];}}while (i <= mid) {tmp[k++] = arr[i++];}while (j <= r) {tmp[k++] = arr[j++];}for (k = 0, i = l; i <= r; ++i, ++k) {arr[i] = tmp[k];}}};

Java 版:

private long cnt = 0;
private int[] tmp;  // 在这里声明辅助数组,而不是在 merge() 递归函数中声明public int InversePairs(int[] nums) {tmp = new int[nums.length];mergeSort(nums, 0, nums.length - 1);return (int) (cnt % 1000000007);
}private void mergeSort(int[] nums, int l, int h) {if (h - l < 1)return;int m = l + (h - l) / 2;mergeSort(nums, l, m);mergeSort(nums, m + 1, h);merge(nums, l, m, h);
}private void merge(int[] nums, int l, int m, int h) {int i = l, j = m + 1, k = l;while (i <= m || j <= h) {if (i > m)tmp[k] = nums[j++];else if (j > h)tmp[k] = nums[i++];else if (nums[i] <= nums[j])tmp[k] = nums[i++];else {tmp[k] = nums[j++];this.cnt += m - i + 1;  // nums[i] > nums[j],说明 nums[i...mid] 都大于 nums[j]}k++;}for (k = l; k <= h; k++)nums[k] = tmp[k];
}

时间复杂度:O(NlogN)

空间复杂度:O(N)

解析参考来自:

数组中的逆序对_牛客网​www.nowcoder.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php5 数据库框架,数据库 · FastAdmin - 基于ThinkPHP5的极速后台开发框架文档 · 看云...

这里提供的是数据库表字段规则在你创建表时使用&#xff0c;当按如下的规则进行字段命名、类型设置和备注时使用php think crud -t 表名生成CRUD时会自动生成对应的HTML元素和组件## 根据字段类型| 类型 | 备注 | 类型说明 || --------- | ---- | ----------------------------…

python的安装包下载_科学网—[转载]python常用的安装包下载 - 林清莹的博文

Python常用的安装包下载1.首先应该下载dlib安装包(例如&#xff1a;dlib-19.8.1-cp36-cp36m-win_amd64.whl)可以通过此网址进行下载对应的dlib包 https://pypi.org/simple/dlib/2.需要使用pip进行安装(之前很多博客说要安装vs2015&#xff0c;然后借用其编译的dlib才能实现在…

java实现条形图,JavaFX条形图

本文概述通常, 条形图可以定义为使用矩形条形表示数据的图。条的长度表示绘制在其中一根轴上的精确数值数据值。矩形条可以在图表上水平或垂直绘制。在下图中, 条形图显示了工程各个分支中的学生人数。 X轴是类别轴, 显示了不同的分支, 而Y轴是数字轴, 显示了特定分支中的学生人…

python缺失值填充均值法_pandas 使用均值填充缺失值列的小技巧分享

pd.DataFrame中通常含有许多特征&#xff0c;有时候需要对每个含有缺失值的列&#xff0c;都用均值进行填充&#xff0c;代码实现可以这样&#xff1a;for column in list(df.columns[df.isnull().sum() > 0]):mean_val df[column].mean()df[column].fillna(mean_val, inpl…

php excel 垂直居中,完美实现文字图片水平垂直居中

垂直居中是一个历史悠久的大问题&#xff0c;要做到兼容所有浏览器少不了要花点时间&#xff0c;网上也流传了很多解决方案&#xff0c;但没发现比我现在用的方案更完美&#xff0c;至少在我的项目是如此。项目中要用到垂直居中而碰到兼容性问题的&#xff0c;一般都是以下几种…

cd短是什么意思_每日命令|pwd、cd

01 命令简介上回说到《每日命令 | ls》&#xff0c;今天我们来说一说pwd命令和cd命令。pwd命令——返回当前工作目录名称。cd命令——改变工作目录。什么是工作目录&#xff1f;举个例子&#xff1a;我在北京上班&#xff0c;那我的工作地点就是北京&#xff1b;后来我到上海上…

sql 查询表结构_SQL查询语句的完整结构解析

SELECT语句完整的句法模板&#xff1a;SELECT [DISTINCT] FROM [ JOIN ON ][WHERE ][GROUP BY [HAVING ]][ORDER BY &#xff0c;...]上述句法模版中的[ ]表示该部分可选。SELECT整个语句的执行过程为&#xff1a;(1) 读取FORM子句中表、视图的数据。(2) 存在连接表时&…

php foreach ,PHP学习之foreach循环时加符号的说明

本文主要内容是关于PHP的foreach循环时加&符号的说明&#xff0c;感兴趣的朋友可以了解一下。foreach时加&符号&#xff1a;遍历的同时改变原数组即修改数据或者增加数据。$arr [a, b, c];foreach ($arr as $key > &$value) {$value $value . 111;}echo json_…

基于matlab实现的云模型计算隶属度,基于MATLAB实现的云模型计算隶属度

”云”或者’云滴‘是云模型的基本单元&#xff0c;所谓云是指在其论域上的一个分布&#xff0c;可以用联合概率的形式(x&#xff0c; u)来表示云模型用三个数据来表示其特征期望&#xff1a;云滴在论域空间分布的期望&#xff0c;一般用符号Εx表示。熵&#xff1a;不确定程度…

notebook python 内嵌 数据库_python数据分析:在jupyter notebook上使用pythonSQL做数据分析...

python数据分析&#xff1a;在jupyter notebook上使用python&SQL做数据分析发布时间&#xff1a;2019-01-14 21:14,浏览次数&#xff1a;1143, 标签&#xff1a;pythonjupyternotebookSQL类似于在jupyter上使用R语言&#xff0c;同样可以使用SQL语句&#xff1a;详细见gith…

php优化上百次foreach,php – 优化数千个项目的foreach

我在一组25,000个结果中运行下面的代码.我需要优化它,因为我达到了内存限制.$oldproducts Oldproduct::model()->findAll(); /*(here i have 25,000 results)*/foreach($oldproducts as $oldproduct) :$criteria new CDbCriteria;$criteria->compare(someid, $oldprodu…

二陈丸配什么吃不上火_宝妈一个人带孩子是什么感觉?前三种场景,不知道是怎么熬过来的...

导语&#xff1a;很多人认为一个家庭主妇很轻松&#xff0c;每天就带带孩子&#xff0c;其他什么都不需要做&#xff0c;远远没有那些人说的那么辛苦&#xff0c;无论是老公还是很多婆婆都认为是在家享福呢&#xff0c;经常就会甩出一句话“每天不就带个孩子吗&#xff1f;至于…

php怎么分割页面,将一个页面分成多个html文件(静态html分割页面)

静态html分割页面&#xff0c;达到类似PHP等动态页面的include引入页面效果。用html把首页分成三个文件web.png在PHP、JSP等动态页面开发中&#xff0c;页面里引入其它页面只需include()进来就可以实现页面的分离。如果用HTML&#xff0c;也是可以实现页面的分割的。两种方法&a…

zbar扫描无法近距离扫码_生意好时最怕收银出故障,这几个扫码枪的常见问题你一定要知道...

文|杭州丰收收不怕生意不够好&#xff0c;就怕生意好时收银出故障。这几天丰收收经常接到询问&#xff0c;说自己商铺所在的位置信号非常不好&#xff0c;很多客户等了很久没法付款&#xff0c;索性就不买了。看着上门的生意就这么走了&#xff0c;心里很不是滋味。遭遇这种经历…

matlab zigzag算法,ZIGZAG扫描的MATLAB实现

用MATLAB实现MPEG中的 ZIG-ZAG 扫描。觉得有点研究价值&#xff0c;实现的方法也很巧妙。下面给一个参照MPEG提供的方法&#xff1a;&#xff1d;&#xff1d;&#xff1d;function bzigzag(a)% 这是参照 University of California 提供的 MPEG 源代码的基础上编制的。% Copyri…

python工业自动化仿真_ABAQUS 中基于 Python 脚本语言开发实现仿真自动化操作

进行 ABAQUS 开发编程前&#xff0c;首先需要明白 ABAQUS 有限元分析思路和基本流程&#xff0c;以及 Python 基本语法和面向对象编程有基本的认识&#xff0c;下面是 Python 和 ABAQUS 的开发模板&#xff1a;# 注释说明本程序需要实现的项目内容和功能##--------------------…

你觉得外观模式和代理模式的联系和区别是什么?_GoF23种设计模式

UML泛化&#xff08;继承非抽象类&#xff09;&#xff1a;带空心三角形的直线表示实现&#xff08;继承抽象类&#xff0c;类实现接口&#xff09;&#xff1a;带空心三角形的虚线表示依赖&#xff1a;类与类之间最弱的关系&#xff0c;依赖可以简单的理解一个类使用了另一个类…

java url headers,Java CloseableHttpResponse.getHeaders方法代码示例

import org.apache.http.client.methods.CloseableHttpResponse; //导入方法依赖的package包/类/*** Makes a HTTP request to the given URL using the given request body,* parameters and HTTP headers. The parameters are used as URL parameters,* but if theres a para…

python tvtk库_PyCharm创建虚拟环境 和 TVTK库的安装

注&#xff1a;示例系统环境&#xff1a;Windows10 64位 Anaconda3&#xff1a;昨天安装TVTK库遇到些麻烦&#xff0c;当时随便将库下到个文件夹安装后(没找到VENV文件夹...)&#xff0c;进行测试&#xff1a;from tvtk.tools import tvtk_doc结果显示No module named ‘trait…

反注入技术:防范非法 Call 调用的探讨

DLL 注入是一种常见的技术&#xff0c;用于向目标进程注入外部的动态链接库&#xff08;DLL&#xff09;&#xff0c;以执行某些特定的操作。这种技术在恶意软件、游戏作弊等场景中被广泛使用&#xff0c;因此&#xff0c;研究和实施一些反注入技术对于提高应用程序的安全性是至…