剑指Offer51.数组中的逆序对 C++

1、题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5

2、VS2019上运行

使用方法一:归并排序

#include <iostream>
#include <vector>using namespace std;class Solution {
public:// 归并排序递归中止条件;l ---当前子数组的起始位置;r ---当前子数组的结束位置。int mergeSort(vector<int>& nums, vector<int>& tmp, int l, int r) {if (l >= r) {return 0;}//分冶int mid = (l + r) / 2;//当前子数组的中间位置//inv_count 是通过对左半部分和右半部分分别调用 mergeSort 函数得到的逆序对数量之和int inv_count = mergeSort(nums, tmp, l, mid) + mergeSort(nums, tmp, mid + 1, r);//合并int i = l, j = mid + 1, pos = l;//其实就是小的元素放入临时数组中,升序排列while (i <= mid && j <= r) {// 当左半部分的数小于等于右半部分的数时,无逆序对,将左半部分的数放入临时数组中if (nums[i] <= nums[j]) {tmp[pos] = nums[i];++i;// 统计逆序对数量inv_count += (j - (mid + 1));}else {// 当左半部分的数大于右半部分的数时,存在逆序对,将右半部分的数放入临时数组中tmp[pos] = nums[j];++j;}++pos;}// 处理剩余的左半部分的数//比如右半部分已经结束了,左半部分还剩下,说明左半部分剩下的比前面所有的都大,所以也构成逆序对for (int k = i; k <= mid; ++k) {tmp[pos++] = nums[k];inv_count += (j - (mid + 1));}// 处理剩余的右半部分的数for (int k = j; k <= r; ++k) {tmp[pos++] = nums[k];}// 将临时数组(排序好的数组)中的元素复制回原数组的相应位置copy(tmp.begin() + l, tmp.begin() + r + 1, nums.begin() + l);// 返回逆序对的数量return inv_count;}// 主函数,计算数组中的逆序对数量int reversePairs(vector<int>& nums) {int n = nums.size();vector<int> tmp(n);//临时数组来存储排序过程中的元素return mergeSort(nums, tmp, 0, n - 1);}
};
int main() {// 创建 Solution 类的实例Solution solution;// 输入数组vector<int> nums = { 7, 5, 6, 4 };// 调用 reversePairs 函数计算逆序对数量int count = solution.reversePairs(nums);// 输出结果cout << "逆序对数量:" << count << endl;return 0;
}

逆序对数量:5

3、解题思路

用算贡献的方法

  • 1.定义一个辅助函数 mergeSort,接受一个整数数组 nums、一个辅助数组 tmp,以及当前子数组的起始位置 l 和结束位置 r。
  • 2.首先在 mergeSort 函数中判断递归终止条件,即当 l >= r 时,返回 0,表示当前子数组中没有逆序对。
  • 3.接下来进行分治的过程,将当前子数组一分为二,分别对左半部分和右半部分分别调用 mergeSort 函数,得到左右两部分的逆序对数量。
  • 4.进行合并的过程,定义三个指针 i、j、pos 分别指向左半部分的起始位置、右半部分的起始位置以及临时数组的当前位置。
  • 5.在合并的过程中,比较左半部分的当前元素 nums[i] 和右半部分的当前元素 nums[j],如果 nums[i] <= nums[j],则将左半部分的元素放入临时数组中,并且为左半部分的元素增加逆序对的数量(因为数组是有序的,所以右半部分的当前元素及其右边的所有元素都是逆序对);如果 nums[i] > nums[j],则将右半部分的元素放入临时数组中。
  • 6.剩余的元素处理,如果左半部分还有剩余元素,将这些元素全部放入临时数组,并且为其增加逆序对的数量;如果右半部分还有剩余元素,将其放入临时数组中。
  • 7.最后,将临时数组中的元素复制回原数组的相应位置,使用 copy 函数进行复制。
  • 8.返回逆序对的数量。
  • 最终,在主函数 reversePairs 中创建一个临时数组 tmp,并调用 mergeSort 函数计算整个数组的逆序对数量。

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

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

相关文章

创建型(一) - 简单工厂模式、工厂方法模式和抽象工厂模式

本文使用了王争老师设计模式课程中的例子&#xff0c;写的很清晰&#xff0c;而且中间穿插了代码优化。 由于设计模式就是解决问题的一种思路&#xff0c;所以每个设计模式会从问题出发&#xff0c;这样比较好理解设计模式出现的意义。 一、简单工厂模式 解决问题&#xff1a…

淘宝Tmall1688京东API接口系列,海量数据值得get!

Api接口也就是所谓的应用程序接口&#xff0c;api接口的全称是Application Program Interface&#xff0c;通过API接口可以实现计算机软件之间的相互通信&#xff0c;开发人员可以通过API接口程序开发应用程序&#xff0c;可以减少编写无用程序&#xff0c;减轻编程任务&#x…

Docker入门知识讲解与实践

文章目录 Dockeryum在线安装安装yum-utils下载aliyun的repo源下载Docker配置加速器 Docker基本操作拉取镜像UbuntuCentos 创建两个容器容器的停止/重启查看容器退出容器交互式非交互式 查看容器内部信息查看Docker相关命令帮助docker rundocker image Docker save与Docker expo…

HJ53 杨辉三角的变形

以上三角形的数阵&#xff0c;第一行只有一个数1&#xff0c;以下每行的每个数&#xff0c;是恰好是它上面的数、左上角数和右上角的数&#xff0c;3个数之和&#xff08;如果不存在某个数&#xff0c;认为该数就是0&#xff09;。 求第n行第一个偶数出现的位置。如果没有偶数…

2023年计算机设计大赛国三 数据可视化 (源码可分享)

2023年暑假参加了全国大学生计算机设计大赛&#xff0c;并获得了国家三等奖&#xff08;国赛答辩出了点小插曲&#xff09;。在此分享和记录本次比赛的经验。 目录 一、作品简介二、作品效果图三、设计思路四、项目特色 一、作品简介 本项目实现对农产品近期发展、电商销售、灾…

金九银十面试题之《JVM》

&#x1f42e;&#x1f42e;&#x1f42e; 辛苦牛&#xff0c;掌握主流技术栈&#xff0c;包括前端后端&#xff0c;已经7年时间&#xff0c;曾在税务机关从事开发工作&#xff0c;目前在国企任职。希望通过自己的不断分享&#xff0c;可以帮助各位想或者已经走在这条路上的朋友…

删除链表的中间节点

题目&#xff1a; 示例&#xff1a; 思路&#xff1a; 这个题类似于寻找链表中间的数字&#xff0c;slow和fast都指向head&#xff0c;slow走一步&#xff0c;fast走两步&#xff0c;也许你会有疑问&#xff0c;节点数的奇偶不考虑吗&#xff1f;while执行条件写成fast&&…

Docker 的数据管理 网络通信

目录 1.管理容器数据的方式 数据卷 数据卷的容器 2.操作命令 3.Docker 镜像的创建 1.管理容器数据的方式 数据卷 可以独立于容器生命周期存储的机制 可提供持久化 数据共享 docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash 数据卷的容器 用来提供持久化数…

那么多优秀的自动化测试工具,而你只知道Selenium?

如今&#xff0c;作为一名软件测试工程师&#xff0c;几乎所有人都需要具备自动化测试相关的知识&#xff0c;并且懂得如何去利用工具&#xff0c;来为企业减少时间成本和错误成本。这是为什么呢&#xff1f; 在以前&#xff0c;测试人员一般都只需要扮演终端用户&#xff0c;…

「隐语小课」拆分学习之“水平拆分学习”

一、引言 拆分学习是 2018 年由 MIT 最先提出的分布式算法。本文结合该领域的相关英文文献&#xff0c;介绍水平拆分学习的基本方法&#xff0c;同时还将对比拆分模型与中心化模型、联邦模型在不同条件下模型效率和准确性。拆分学习作为主流的隐私计算学习范式之一&#xff0c…

layui tree组件取消勾选

layui(2.8.15) tree的api中&#xff0c;只有 tree.setChecked(id, idArr) 方法&#xff0c;没有取消勾选的方法。 我的需求是&#xff1a;勾选后做判断&#xff0c;如果不符合条件则取消勾选。 实现方法&#xff1a; 使用 tree的oncheck事件&#xff0c;在回调函数中做判断&…

Python学习笔记_进阶篇(二)_django知识(一)

本章简介&#xff1a; Django 简介Django 基本配置Django urlDjango viewDjango 模板语言Django Form Django 简介 Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MVC的软件设计模式&#xff0c;即模型M&#xff0c;视图V和控制器C。它最初是被开发来…

第十一章MyBatis查询专题

返回单个Car 返回单个可以直接用Car接收返回参数 Car carCarMapper.getOne(100);返回多个Car 返回多个可以直接用List接收返回参数 List<Car> carCarMapper.getAll();用一个对象无法接受返回多个参数&#xff0c;用list可以接收返回一个参数 返回Map 如果没有合适的…

亚马逊云科技 云技能孵化营——机器学习心得

亚马逊云科技 云技能孵化营机器学习心得 前言什么是机器学习&#xff1f;机器学习如何解决业务问题&#xff1f;什么时候适合使用机器学习模型&#xff1f;总结 前言 很荣幸参加了本次亚马逊云科技云技能孵化营&#xff0c;再本期的《亚马逊云科技云技能孵化营》中&#xff0c…

LeetCode算法心得——k-avoiding 数组的最小总和(标记数组)

大家好&#xff0c;我是晴天学长&#xff0c;这是一个细节题和一部分的思维题哈&#xff01; 2) .算法思路 k-avoiding 数组的最小总和 1,填充一个1到n 的Boolean的数组 要n个数&#xff0c;但是数组大小不能确定。 所以建立1000的大小。 2.遍历筛选&#xff0c;如果数组中有这…

【力扣】70. 爬楼梯 <动态规划>

【力扣】70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. …

ansible远程执行命令

一、ansible简介 需要在一台机器上搭建ansible环境&#xff0c;且配置目的ip的密码&#xff0c;通道没有问题即可下发命令 使用的通道是ssh&#xff08;端口&#xff1a;36000&#xff09; 二、搭建细节 1、安装ansible yum install -y ansible 2、把目的ip密码写到配置…

关于chromedriver.exe一系列问题的解决办法

最新 chromedriver.exe下载地址&#xff1a;https://googlechromelabs.github.io/chrome-for-testing/#stable 下载最新版本的 chromedriver.exe 将其解压在 python.exe 同目录下&#xff0c;以及Chrome 的路径下 例如&#xff1a; C:\Program Files\Google\Chrome\Applicati…

vue2,使用element中的Upload 上传文件,自定义上传http-request上传,上传附件支持多选,多个文件只发送一次请求,代码里有注释

复制直接使用&#xff0c;组件根据multiple是否多选来返回附件内容&#xff0c;支持多选就返回数据附件&#xff0c;则返回一个附件对象。 //uploadFiles.vue<template><div><el-uploadclass"avatar-uploader"action"#":accept"accep…

微信小程序测试策略和注意事项?

一、测试前准备&#xff08;环境搭建&#xff09; 1、前端页面 微信 Web 开发者工具安装、授权测试用的微信号可预览和调试小程序 2、管理后台 配置内网测试服务器环境&#xff0c;通过 PC 端 Web 站点管理小程序前端的输出内容&#xff0c;可从开发人员获取管理账号进行测…