LCR 170. 交易逆序对的总数(C语言+分治递归)

news2024/11/18 14:30:40

1. 题目

        在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。

2. 输入输出样例

        示例1

输入:record = [9, 7, 5, 4, 6]
输出:8
解释:交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。

        限制

0 <= record.length <= 50000

3. 实现思路

         使用分治和归并排序的方法来计算整数数组中的逆序对数量,主要的思路是:

        (1)将数组分解为两个子数组;

        (2)递归地计算每个子数组的逆序对数量;

        (3)在归并的过程中,统计两个子数组之间的逆序对数量,并将子数组合并成一个有序的数组;

        (4)通过递归和归并的结合,得出整个数组中的逆序对数量。

  • 分解阶段:将数组分解为两个子数组,这个过程需要 O(1) 的时间。
  • 递归计算阶段:递归地计算左子数组和右子数组的逆序对数量,每次递归都将数组大小减半。因为有 log₂(n) 层递归,每层的时间复杂度是 O(n),所以总的时间复杂度是 O(nlogn)。
  • 归并阶段:在归并的过程中,需要线性时间 O(n) 来合并两个有序子数组。因为在每层递归中都会执行这个操作,总的时间复杂度是 O(nlogn)。
  •  综合以上三个阶段,总的时间复杂度是 O(nlogn)。

4. 实现代码 

// 定义递归函数 nxs,用于计算逆序对数量
int nxs(int* nums, int l, int r){
    // 如果子数组的左边界大于或等于右边界,说明子数组中没有元素或只有一个元素,逆序对数量为0
    if(l >= r){
        return 0;
    }

    // 分解:将当前数组划分为两个子数组
    int mid = (l + r) / 2;
    int tl = nxs(nums, l, mid); // 递归计算左子数组中的逆序对数量
    int tr = nxs(nums, mid + 1, r); // 递归计算右子数组中的逆序对数量

    // 求和(采用归并排序的思想)
    int i = l, j = mid + 1, k = 0, count = 0;
    int *B = (int*)malloc(sizeof(int) * (r - l + 1)); // 创建一个临时数组 B 存储归并后的结果

    // 归并过程
    while(i <= mid && j <= r){
        if(nums[i] > nums[j]){
            B[k++] = nums[j++];
            count += (mid - i + 1); // 如果 nums[i] > nums[j],则说明 nums[i] 及其后面的元素都与 nums[j] 构成逆序对
        }
        else{
            B[k++] = nums[i++];
        }
    }
    
    // 处理剩余元素
    while(i <= mid){
        B[k++] = nums[i++];
    }
    while(j <= r){
        B[k++] = nums[j++];
    }

    // 将归并后的结果复制回原数组 nums
    i = l, j = 0;
    while(j < k){
        nums[i++] = B[j++];
    }

    // 返回当前子数组中的逆序对数量
    return tl + count + tr;
}

// 主函数,调用 nxs 函数来计算整个数组中的逆序对数量
int reversePairs(int* nums, int numsSize){
    return nxs(nums, 0, numsSize - 1);
}

LCR 170. 交易逆序对的总数 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/

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

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

相关文章

[架构之路-225]:计算机体系结构 - 分类方法大汇总

目录 一、分类方法汇总 二、指令流和数据流的关系分类 三、Flynn 分类&#xff1a;指令并行处理 四、根据指令集架构&#xff08;ISA&#xff09;分类 4.1 分类 4.2 开源的RISC-V与封闭的RISC指令集架构比较 4.3 RISC-V的演进路径 4.4 RISC-V与中国芯片自研 一、分类方…

macOS Sonoma 正式版系统已发布,要不要更新macos14系统

北京时间9月27日macOS Sonoma 正式版系统发布&#xff0c;为 Mac 带来一系列丰富新功能&#xff1a;优化小组件、升级视频会议、沉浸式游戏体验等&#xff0c;最新macos14值得更新吗&#xff1f;这里根据我一个月的试用beta版本体验来分享一下。 我使用的是M1芯片的MacBook air…

0基础学习VR全景平台篇 第101篇:企业版功能-子账号分配管理

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;企业版教程-子账号分配管理功能&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 子账号分配管理功能&#xff0c;主要用于企业版用户为自己服务的终…

python在字典中插入或增加一个字典

现在有字典dict_1 {}&#xff0c;字典dict_2 {name: Lihua, age: 19} &#xff0c;dict_3 {name: 小红, age: 18} 我们想将字典dict_2和字典dict_3加入到dict_1中&#xff0c;我们可以这么写 dict_2 {name: Lihua, age: 19} dict_3 {name: 小红, age: 18} dict_1 {}dict_…

Android导航抽屉

本文所有代码均位于https://github.com/MADMAX110/CatChat 之前使用过标签页布局可以让用户在应用中轻松地导航。 当只有为数不多地几个类别屏幕&#xff0c;而且它们都在应用层次结构地同一级上&#xff0c;标签页布局就很适用。 而抽屉导航可以实现更多选择&#xff0c;这是一…

【vue.js】路由使用与Node.js下载安装之环境配置

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1、路由 1.1什么是路由 1.2 案列实操 1.2.1 引入vue-router的js依赖 1.2.2 定义组…

常见的BOM对象

BOM是浏览器对象模型&#xff0c;提供了独立于内容与浏览器窗口进行交互的对象&#xff0c;其作用就是根浏览器做一些交互效果。 比如&#xff0c;如何进行页面的后退&#xff0c;前进&#xff0c;刷新&#xff0c;滚动条的滚动等等。 常见的BOM对象有 一. window BOM的核心…

如何离线安装和使用pymysql操作mysql数据库

一、应用背景 在企业内部网络要使用python操作mysql数据库。然而&#xff0c;python未自带访问MySQL数据库的函数库pymysql&#xff0c;需要另外安装。网上有很多安装pymysql都需要互联网支持。本文主要阐述如何离线安装pymysql,并简要介绍pymysql如何进行mysql操作。 pymysq…

nodejs+vue中国非物质文化遗产网站设计与实现elementui

前端页面&#xff1a; 导航栏借鉴下面的 1首页&#xff1a;带有一个全屏轮播图和其他的内容 2咨询页&#xff1a;有关中国非物质文化遗产的一些新闻咨询网站对于记录非遗这种无形的、动态的文化资源有着其他技术无可替代的优势。用户可以在该网站浏览、了解和学习非遗文化&…

Unity3d中Scene场景2D模式下放大后UI元素后不显示的问题

如题&#xff1a;UI在game视图显示没有问题&#xff0c; 在Play状态下&#xff0c;在Sence视图查看UI对象的时候进行放大操作&#xff0c;然后UI就不显示了或者显示不全&#xff0c;缩小就恢复正常。这让我在Play模式下预览UI状态很麻烦。相关问题描述较少。 初步判定为摄像机…

河北吉力宝以步力宝健康鞋引发的全新生活生态商

在当今瞬息万变的商业世界中&#xff0c;成功企业通常都是那些不拘泥于传统、勇于创新的先锋之选。河北吉力宝正是这样一家企业&#xff0c;通过打造一双步力宝健康鞋&#xff0c;他们以功能性智能科技穿戴品为核心&#xff0c;成功创造了一种结合智能康养与时尚潮流的独特产品…

IDEA运行第一个Java简单程序(新建项目到运行类)

目录 前言 一、准备工作 JDK下载安装 1.IDEA下载安装 二、IDEA建立项目 &#xff08;一&#xff09;新建项目&#xff08;银河系&#xff09; &#xff08;二&#xff09;新建模块&#xff08;地球&#xff09; &#xff08;三&#xff09;新建包&#xff08;国家&#…

【JVM】内存分区

内存分区 一. JVM 执行流程二. JVM 运行时数据区1. 堆&#xff08;线程共享&#xff09;2. Java虚拟机栈&#xff08;线程私有&#xff09;3. 本地方法栈&#xff08;线程私有&#xff09;4. 程序计数器&#xff08;线程私有&#xff09;5. 方法区&#xff08;线程共享&#xf…

Unity:2D游戏设置相机orthographicSize

目录 根据设备分辨率动态设置相机 orthographicSize 根据设备分辨率动态设置相机 orthographicSize 2d游戏里面相机的Orthan.size确定的是高度&#xff0c;宽度是按照屏幕的宽高比计算出来的cameraWidthSize camera.Orthographic.size*(Screen.Width/Screen.height)我在游戏…

内网穿透--cpolar

工具介绍 cpolar是一种安全的内网穿透云服务&#xff0c;它将内网下的本地服务器通过安全隧道暴露至公网。使得公网用户可以正常访问内网服务。 下载位置 cpolar官网&#xff1a;cpolar - 安全的内网穿透工具 创建隧道映射 cpolar安装成功后&#xff0c;双击打开cpolar web u…

一文教你如何配置路由策略

【微|信|公|众|号&#xff1a;厦门微思网络】 微思-课程介绍 组网需求 如图1所示&#xff0c;某公司的部门A和部门B相距较远&#xff0c;Router_1和Router_6分别作为这两个部门的出口设备&#xff0c;AS 100内部使用OSPF作为IGP。现要求&#xff1a; 通过部署BGP&#xff0c;使…

实验三--贪心算法的设计与分析

某不知名学校算法课第三次实验报告 题目来自力扣 这次实验是贪心算法 贪心的思维很跳跃&#xff0c;每道题也没有固定的模板的思考方向 跳跃游戏 题目描述&#xff1a; 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳…

PHP 电竞网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 电竞网站系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php电竞网站系统 代码 https://download.csdn.net/download/qq_41221322/88377255 论文 h…

基于linux的进程信号知识

1.前言 生活当中我们无时不刻都在接触外界给予我们各种各样的信号&#xff0c;比如穿越马路时看到红灯就得停下来&#xff0c;在比如听到手机铃声就得接电话&#xff0c;那么生活中如果很多重要的信号同时发生了&#xff0c;你会先做哪个事情&#xff1f;换句化说你会如何处理…

Failed to load the JNI shared library “D:\...\jvm.dll

1.解决办法&#xff1a; 64-bit Eclipse requires a 64-bit JVM, and 32-bit Eclipse requires 32-bit JVM--you can not mix-and-match between 32-bit and 64-bit. 2.问题&#xff1a; 下载了Eclipse4.16&#xff0c;openjdk8&#xff0c;双击安装Eclipse无法启动&#x…