Day 21: 数组中的逆序对
在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。
示例 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
LCR 170. 交易逆序对的总数 - 力扣(LeetCode)
这个题目要用归并排序来写,暴力解法很容易想得到。刚好借这个题目来复习一下归并排序。
归并排序的代码如下:
public class MergeSort {// 归并排序的主方法public static void mergeSort(int[] arr) {if (arr == null || arr.length <= 1) {return; // 如果数组为空或只有一个元素,直接返回}int[] temp = new int[arr.length]; // 临时数组,用于合并mergeSort(arr, 0, arr.length - 1, temp);}// 递归分治private static void mergeSort(int[] arr, int left, int right, int[] temp) {if (left < right) {int mid = left + (right - left) / 2; // 计算中间位置mergeSort(arr, left, mid, temp); // 对左半部分排序mergeSort(arr, mid + 1, right, temp); // 对右半部分排序merge(arr, left, mid, right, temp); // 合并两个有序部分}}// 合并两个有序数组private static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left; // 左半部分的起始索引int j = mid + 1; // 右半部分的起始索引int k = 0; // 临时数组的起始索引// 将两个有序数组合并到临时数组中while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}// 将左半部分剩余的元素复制到临时数组while (i <= mid) {temp[k++] = arr[i++];}// 将右半部分剩余的元素复制到临时数组while (j <= right) {temp[k++] = arr[j++];}// 将临时数组中的元素复制回原数组k = 0;while (left <= right) {arr[left++] = temp[k++];}}
需要注意这段代码:
// 将临时数组中的元素复制回原数组k = 0;while (left <= right) {arr[left++] = temp[k++];}
写的时候容易漏掉,临时数组的元素一定要返回到原数组中。
我们会发现在归并排序的过程中都会比较两个子序列中两个数的大小,在合并两个子序列的过程中,右边的数组指针指向i项,比左边的元素小,由于左右子序列都是已经排好序的了,那么右边数组就有i项比左边现在这个元素小,也就是有i个子序列。注意一开始指针指向子数组末尾。
基于这个思想,只要在归并排序的过程中统计逆序对个数就行了。
class Solution {public int reversePairs(int[] record) {if (record == null || record.length <= 1) {return 0; // 如果数组为空或只有一个元素,直接返回}int[] temp = new int[record.length]; // 临时数组,用于合并int num = mergeSort(record, 0, record.length - 1, temp);return num;}private int mergeSort(int[] arr, int left, int right, int[] temp){if(left >= right){return 0;}int mid = left + (right - left)/2;int l = mergeSort(arr, left, mid, temp);int r = mergeSort(arr, mid + 1, right, temp);if (arr[mid] <= arr[mid + 1]) {return l + r;}int cur = merge(arr, left, mid, right, temp);return l + r + cur;}private int merge(int[] arr, int left, int mid, int right, int[] temp){int i = mid;int j = right;int k = right;//临时数组的索引int reversePairsNum = 0;//逆序对个数。while (i >= left && j > mid) {if (arr[i] > arr[j]) {reversePairsNum += (j - mid);temp[k] = arr[i];k--;i--;} else {temp[k] = arr[j];k--;j--;}}// 将左半部分剩余的元素复制到临时数组while (i >= left) {temp[k--] = arr[i--];}// 将右半部分剩余的元素复制到临时数组while (j > mid) {temp[k--] = arr[j--];}// 将临时数组中的元素复制回原数组for (i = left; i <= right; i++) {arr[i] = temp[i];}return reversePairsNum;}
}
很多细节没注意到,一开始写成i > left导致总是漏掉最小元素的逆序对,我觉得还是归并的熟练度不够。我是按照剑指offer里面思路写的,把归并排序逆过来了。比较直观。但是逆过来的时候等号取不取得到要注意一下。建议手动排序一下。
力扣上采用的是正向的归并排序,不容易出错:
private int mergeAndCount(int[] record, int left, int mid, int right, int[] temp) {for (int i = left; i <= right; i++) {temp[i] = record[i];}int i = left;int j = mid + 1;int count = 0;for (int k = left; k <= right; k++) {if (i == mid + 1) {record[k] = temp[j];j++;} else if (j == right + 1) {record[k] = temp[i];i++;} else if (temp[i] <= temp[j]) {record[k] = temp[i];i++;} else {record[k] = temp[j];j++;count += (mid - i + 1);}}return count;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solutions/216984/shu-zu-zhong-de-ni-xu-dui-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
其实二者的本质是一样的,【3,5,7,9】和 【4,6,8,10】当5>4的时候就把(7,4) (9,4) 算进去。所以每次count只要加上mid-i +1即可。
我一开始想用j - mid发现在偶数是对的,奇数就是错的,因为比如[3,5,7,8][4,6,9]这样的数组,因为奇数个的会把mid取在left这边,就会导致8为第一项的逆序对无法加入,因为不会出现8>?的判断条件。
相关文章:
Day 21: 数组中的逆序对
在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。 示例 1: 输入:record [9…...
【C++教程】setw()函数的使用方法
setw 是 C 中用于设置输出字段宽度的函数,属于 <iomanip> 头文件。以下是其使用方法及注意事项: 基本用法 包含头文件: #include <iostream> #include <iomanip> // 必须包含此头文件 using namespace std; // 避免写 std…...
智慧高速,安全护航:视频监控平台助力高速公路高效运营
随着我国高速公路里程的不断增长,交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求,而监控视频平台的出现,则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…...
Jboss漏洞再现
一、CVE-2015-7501 1、开环境 2、访问地址 / invoker/JMXInvokerServlet 出现了让下载的页面,说明有漏洞 3、下载ysoserial工具进行漏洞利用 4、在cmd运行 看到可以成功运行,接下来去base64编码我们反弹shell的命令 5、执行命令 java -jar ysoserial-…...
C语言三大程序结构 单分支语句
核心概念:程序就像流水线,通过顺序、选择、循环三种结构完成复杂任务 🌟 一、三大程序结构图解 结构类型形象比喻代码示例顺序直行马路 → 不拐弯printf("A"); printf("B");选择岔路口 → 二选一if...else循环环形跑道 …...
【Linux系统】Linux权限讲解!!!超详细!!!
目录 Linux文件类型 区分方法 文件类型 Linux用户 用户创建与删除 用户之间的转换 su指令 普通用户->超级用户(root) 超级用户(root) ->普通用户 普通账户->普通账户 普通用户的权限提高 sudo指令 注: Linux权限 定义 权限操作 1、修改文…...
Winform零基础从入门到精通(5)——WinForm菜单与工具栏开发详解
一、核心控件与功能 MenuStrip(顶部菜单栏) • 功能:创建应用程序主菜单,支持多级子菜单和快捷键。 • 关键操作: ◦ 添加菜单项:直接在菜单栏输入文字(如“文件(F)”),…...
2.创建Collection、添加索引、加载内存、预览和搜索数据
milvus官方文档 milvus2.3.1的官方文档地址: https://milvus.io/docs/v2.3.x 使用attu创建collection collection必须要有一个主键字段、向量字段 确保字段类型与索引类型兼容 字符串类型(VARCHAR)通常需要使用 Trie 索引,而不是 AutoInd…...
AIGC 新势力:探秘海螺 AI 与蓝耘 MaaS 平台的协同创新之旅
探秘海螺AI:多模态架构下的认知智能新引擎 在人工智能持续进阶的进程中,海螺AI作为一款前沿的多功能AI工具,正凭借其独特的多模态架构崭露头角。它由上海稀宇科技有限公司(MiniMax)精心打造,依托自研的万亿…...
一文解读DeepSeek在法律商业仲裁细分行业的应用
引言 当AI闯入法律界:DeepSeek如何把商业仲裁变成“纠纷快车道” AI技术正在像水电煤一样渗透生活,随着DeepSeek的爆火出圈,全国各行各业都在如火如荼地接入DeepSeek,以期望利用DeepSeek的“超能力”来重塑各自行业的效能和格局&a…...
快速入手-基于Django的主子表间操作mysql(五)
1、如果该表中存在外键,结合实际业务情况,那可以这么写: 2、针对特殊的字典类型,可以这么定义 3、获取元组中的字典值和子表中的value值方法 4、对应的前端页面写法...
HTTPS协议—加密算法和中间攻击人的博弈
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
【大模型理论篇】CogVLM:多模态预训练语言模型
1. 模型背景 前两天我们在《Skywork R1V: Pioneering Multimodal Reasoning with Chain-of-Thought》中介绍了将ViT与推理模型结合构造多模态推理模型的案例,其中提到了VLM的应用。追溯起来就是两篇前期工作:Vision LLM以及CogVLM。 今天准备回顾一下Cog…...
AI知识补全(一):tokens是什么?
名人说:苔花如米小,也学牡丹开。——袁枚《苔》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是Tokens?二、为什么Tokens如此重要?1.模型的输入输出限制2.…...
Wpf Avalonia-实现中英文切换工程
文章目录 language工程项目代码创建获取资源文件string工程图片主项目引用LanguageView中使用ViewModel中使用language工程项目 <Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><ImplicitUsings>enable</ImplicitUsings><TargetFrame…...
pyqt5报错:qt.qpa.plugin: Could not find the Qt platform plugin “xcb“(已解决)
我在使用pyqt库的时候报错: qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in \ "/mnt/private_disk/anaconda3/envs/aot-manip/lib/python3.8/site-packages/PyQt5/Qt5/plugins/platforms" even though it was found. This ap…...
【MySQL数据库】触发器与事件
MySQL触发器 trigger,在表的插入insert、更新update、删除delete操作发生时自动执行MySQL语句。 学过Qt的都知道信号槽,一旦发出某个信号,那么就会触发关联的信号槽函数。触发器就类似于这个操作。 创建触发器时需要给出一些信息ÿ…...
【LC插件开发】基于Java实现FSRS(自由间隔重复调度算法)
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文讲解【LC插件开发】基于Java实现FSRS(自由间隔重复调度算法),期待与你一同探索、学习、进步,一起卷起来叭! 目录…...
java后端接收数组,数组长度超256个就会报错
1.原因 DataBinder 中默认限制了list最大只能增长到256。 2.解决方案 1.在BaseController添加InitBinder方法,其余继承BaseController InitBinder //类初始化是调用的方法注解public void initBinder(WebDataBinder binder) {//给这个controller配置接收list的长…...
第45章:配置更新与应用热重载策略
第45章:配置更新与应用热重载策略 作者:DogDog_Shuai 阅读时间:约25分钟 难度:中级 目录 1. 引言2. 配置更新挑战3. Kubernetes原生配置更新机制4. 应用热重载技术5. 配置更新最佳实践...
数据库MVCC详解
MVCC 1.基本介绍 数据库:MySQL。【很多主流数据库都使用了MVCC,比如MySQL的InnoDB引擎、PostgreSQL、Oracle】 MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。是数据库管理系统中的一种并发控制方法。 MVCC的…...
MySQL数据库基础篇
目录 SQL的分类 数据定义语言(DDL)---Data Definition Language 数据操作语言(DML) ---Data Manipulation Language 数据查询语言(DQL) ---Data Query Language 数据控制语言(DCL) ---Data Control Language 事务控制语言(TCL) --- Transaction Cont…...
Rust函数、条件语句、循环
文章目录 函数**语句与表达式**条件语句循环 函数 Rust的函数基本形式是这样的 fn a_func(a: i32) -> i32 {}函数名是蛇形风格,rust不在意函数的声明顺序,只需要有声明即可 函数参数必须声明参数名称和类型 语句与表达式 这是rust非常重要的基础…...
AI比人脑更强,因为被植入思维模型【17】万物联系思维模型
万物联系,万物,并不孤立。 定义 万物联系思维模型是一种强调世界上所有事物都相互关联、相互影响的思维方式。它认为任何事物都不是孤立存在的,而是与周围的环境、其他事物以及整个宇宙构成一个有机的整体。这种联系不仅包括直接的因果关系,还涵盖了间接的、潜在的、动态的…...
Android Compose 约束布局(ConstraintLayout、Modifier.constrainAs)源码深度剖析(十二)
Android Compose 约束布局(ConstraintLayout、Modifier.constrainAs)源码深度剖析 一、引言 在 Android 开发中,布局是构建用户界面的基础。随着 Android 开发技术的不断发展,Jetpack Compose 作为一种全新的声明式 UI 框架应运…...
【MySQL篇】复合查询
目录 前言: 1,多表查询 2,自连接 3,子查询 3.1,单行子查询 3.2,多行子查询 3.3,多列子查询 3.3,在from子句中使用子查询 4,合并查询 4.1,union …...
点亮STM32最小系统板LED灯
对于如何点亮板载LED灯只需要掌握如何初始化GPIO引脚,并改变GPIO引脚的电平即可实现点亮或者熄灭LED。 Led_INFO led_info {0}; led_info 是一个结构体变量,类型为 Led_INFO,用于存储LED的状态信息。这里初始化为 {0},表示所有成…...
unsloth微调QwQ32B(4bit)
unsloth微调QwQ32B(4bit) GPU: 3090 24G unsloth安装部署 pip 安装 pip install unsloth --index https://pypi.mirrors.usrc.edu.cn/simplesource /etc/network_turbopip install --force-reinstall --no-cache-dir --no-deps githttps://github.com/unslothai/unsloth.git…...
基于腾讯云大模型知识引擎×DeepSeek的高等职业学校单独招生二级学院考前咨询系统
1、主要思路 通过大模型知识引擎DeepSeek搭建高等职业学校单独招生二级学院考前咨询专有问答,使得专业老师能够更好的服务考试学生,有利于二级学院能够更好的进行考试宣传,招来优秀学子! 2、创作过程 2.1、本地部署大模型的缺陷…...
【Linux】线程库
一、线程库管理 tid其实是一个地址 void* start(void* args) {const char* name (const char *)args;while(true){printf("我是新线程 %s ,我的地址:0x%lx\n",name,pthread_self());sleep(1);}return nullptr; }int main() {pthread_t tid…...
