news 2026/7/27 13:53:05

算法日记分治:用归并排序解决逆序对问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法日记分治:用归并排序解决逆序对问题

🎬 胖咕噜的稞达鸭:个人主页

🔥 个人专栏: 《数据结构》《C++初阶高阶》
《Linux系统学习》
《算法日记》
⛺️技术的杠杆,撬动整个世界!

剑指Offer.数组中逆序对

https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/description/

--------------------------------- left mid mid+1 right

利用归并排序解决该问题。
策略一:找出该数之前,有多少个数比我大,

1.nums[cur1] <= nums[cur2] cur1++ 2.nums[cur1] > nums[cur2] ret+=mid - cur1 + 1;cur2++

刚才算法中,数组是升序的,
如果数组是降序的,该怎么做?不能用策略一。
策略二:
可以用降序做,找出该数之后,有多少个数比我小

nums[cur1] > nums[cur2] ret += right - cur2 + 1 nums[cur1] <= nums[cur2] cur2++

方法一:用升序数组来解决这道题

classSolution{inttmp[50001];public:intreversePairs(vector<int>&nums){returnmergeSort(nums,0,nums.size()-1);}intmergeSort(vector<int>&nums,intleft,intright){if(left>=right)return0;//1.找中间点intmid=(left+right)>>1;intret=0;//2.左边的个数(paixu)加上右边的个数 + 排序ret+=mergeSort(nums,left,mid);ret+=mergeSort(nums,mid+1,right);//3.一左一右的个数intcur1=left,cur2=mid+1,i=0;while(cur1<=mid&&cur2<=right){if(nums[cur1]<=nums[cur2]){tmp[i++]=nums[cur1++];}else{ret+=mid-cur1+1;tmp[i++]=nums[cur2++];}}//4.处理排序的while(cur1<=mid)tmp[i++]=nums[cur1++];while(cur2<=right)tmp[i++]=nums[cur2++];for(intj=left;j<=right;j++)nums[j]=tmp[j-left];returnret;}};

方法二:用降序数组来解决这道题

classSolution{inttmp[50001];public:intreversePairs(vector<int>&nums){returnmergeSort(nums,0,nums.size()-1);}intmergeSort(vector<int>&nums,intleft,intright){if(left>=right)return0;//1.找中间点intmid=(left+right)>>1;intret=0;//2.左边的个数(paixu)加上右边的个数 + 排序ret+=mergeSort(nums,left,mid);ret+=mergeSort(nums,mid+1,right);//3.一左一右的个数intcur1=left,cur2=mid+1,i=0;while(cur1<=mid&&cur2<=right){if(nums[cur1]<=nums[cur2]){tmp[i++]=nums[cur2++];}else{ret+=right-cur2+1;tmp[i++]=nums[cur1++];}}//4.处理排序的while(cur1<=mid)tmp[i++]=nums[cur1++];while(cur2<=right)tmp[i++]=nums[cur2++];for(intj=left;j<=right;j++)nums[j]=tmp[j-left];returnret;}};
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 16:23:04

基于ms-swift的客户流失预警与挽留策略

基于 ms-swift 的客户流失预警与挽留策略 在金融、电信和电商行业&#xff0c;一个高价值客户的流失可能意味着数月甚至数年的营收损失。传统风控系统依赖规则引擎或浅层模型判断用户是否可能离网&#xff0c;但面对日益复杂的用户行为轨迹——从APP操作日志到客服语音记录、再…

作者头像 李华
网站建设 2026/7/25 7:39:09

5个必学技巧:让PCSX2游戏体验飙升的终极配置指南

5个必学技巧&#xff1a;让PCSX2游戏体验飙升的终极配置指南 【免费下载链接】pcsx2 PCSX2 - The Playstation 2 Emulator 项目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2 还在为PS2游戏在模拟器中运行不畅而困扰&#xff1f;PCSX2作为最受欢迎的PlayStation …

作者头像 李华
网站建设 2026/7/25 8:06:24

Grok-2本地AI助手部署终极指南:3大优势+4步配置+5种应用场景

Grok-2本地AI助手部署终极指南&#xff1a;3大优势4步配置5种应用场景 【免费下载链接】grok-2 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/grok-2 想要在个人电脑上拥有一个专属的AI助手吗&#xff1f;Grok-2作为新一代对话模型&#xff0c;通过本地部署技…

作者头像 李华
网站建设 2026/7/26 16:26:04

轻量化AI安全检测的技术革命与行业重塑

轻量化AI安全检测的技术革命与行业重塑 【免费下载链接】Qwen3Guard-Gen-0.6B 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3Guard-Gen-0.6B 当内容安全成为AI应用的最大瓶颈 在生成式AI技术席卷全球的浪潮中&#xff0c;一个不容忽视的挑战正在浮出水面&a…

作者头像 李华
网站建设 2026/7/26 18:15:57

微信小程序消息处理架构实战:构建高性能异步消息系统

微信小程序消息处理架构实战&#xff1a;构建高性能异步消息系统 【免费下载链接】WeiXinMPSDK JeffreySu/WeiXinMPSDK: 是一个微信小程序的开发工具包&#xff0c;它可以方便开发者快速开发微信小程序。适合用于微信小程序的开发&#xff0c;特别是对于需要使用微信小程序开发…

作者头像 李华
网站建设 2026/7/24 18:33:20

Vita3K:开启掌机游戏跨平台体验新时代

Vita3K&#xff1a;开启掌机游戏跨平台体验新时代 【免费下载链接】Vita3K Experimental PlayStation Vita emulator 项目地址: https://gitcode.com/gh_mirrors/vi/Vita3K 在数字娱乐快速发展的今天&#xff0c;游戏玩家对于跨平台体验的需求日益增长。作为一款创新的P…

作者头像 李华