news 2026/6/9 13:12:57

【剑斩OFFER】算法的暴力美学——计算右侧小于当前元素的个数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【剑斩OFFER】算法的暴力美学——计算右侧小于当前元素的个数

一、题目原理

二、算法原理

使用归并排序算法(降序)+ 绑定数组下标 来解决这道题:

当 nums[ begin1 ] > nums[ begin2 ] 时,end2 - begin2 + 1个数字小于nums[ begin1 ];例如 :7 > 4 ,那么 4 到 1 之间的数字都小于7;

因为在合并两个数组的时候会打乱各个数字的下标,根据题目要求我们是要在原数组的下标来判断每个数字的右边有多少个数字是小于当前数字的,所以我们要弄出两个数组来绑定下标:index1 和 index2 ,其中 index1 是保存原来数组的下标,而 index2 是保存合并数组后各个数字对应原来数组的下标,保证各个数字对应的下标不会乱,到时候再把 index2 里面的数字跟新到 index1 里面:

三、代码实现

class Solution { vector<int> tmp; vector<int> index1; vector<int> index2; vector<int> ret; public: vector<int> countSmaller(vector<int>& nums) { tmp.resize(nums.size()); index1.resize(nums.size()); ret.resize(nums.size()); index2.resize(nums.size()); for(int i = 0; i < nums.size();i++) index1[i] = i; Quicksort(0,nums.size()-1,nums,tmp); return ret; } void Quicksort(int l,int r,vector<int>& nums,vector<int>& tmp) { if(l >= r) return; int keyi = (r + l) >> 1; Quicksort(l,keyi,nums,tmp);//左边:【 l , keyi 】 Quicksort(keyi + 1,r,nums,tmp);//右边:【keyi + 1,r 】 int begin1 = l,end1 = keyi;//左边数组 int begin2 = keyi + 1,end2 = r;//右边数组 int index = l;//遍历起始点 while(begin1 <= end1 && begin2 <= end2)//比较遍历 { if(nums[begin1] > nums[begin2]) { ret[index1[begin1]] += end2 - begin2 + 1; index2[index] = index1[begin1];//绑定下标 tmp[index++] = nums[begin1++]; } else { index2[index] = index1[begin2]; tmp[index++] = nums[begin2++]; } } while(begin1 <= end1) { index2[index] = index1[begin1]; tmp[index++] = nums[begin1++];//把左边剩余的数字放到 tmp } while(begin2 <= end2) { index2[index] = index1[begin2]; tmp[index++] = nums[begin2++];//把右边剩余的数字放到 tmp } for(int i = l;i <= r;i++) { index1[i] = index2[i]; nums[i] = tmp[i];//把 tmp 里面的数字放回到原数组 nums } } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 8:18:49

19、Samba使用指南:名称解析与额外功能配置

Samba使用指南:名称解析与额外功能配置 1. Samba名称解析概述 在NetBIOS名称服务器(NBNS)出现之前,名称解析完全依靠广播。若要获取某台机器的地址,只需在网络中广播其名称,理论上该机器会作出回应。例如,若要查找名为“fred”的机器,仍可通过广播查询来确定其是否存在…

作者头像 李华
网站建设 2026/6/8 19:46:03

无代码解决方案:解锁数字化转型的普惠路径

在数字化转型进入深水区的当下&#xff0c;企业对数字化工具的核心诉求已从“功能完备”转向“快速适配、低成本落地、业务主导”。传统代码开发模式因周期长、成本高、技术门槛高的弊端&#xff0c;难以满足中小企业和业务部门的灵活需求。无代码解决方案以可视化配置、拖拽式…

作者头像 李华
网站建设 2026/6/5 22:44:40

YMatrix 高可用详解:3 种镜像策略在节点宕机时表现有何不同?

前言 不同镜像策略如何对集群高可用表现产生影响&#xff1f; 在数据库中&#xff0c; 高可用性是保障业务连续性的核心——一旦 Primary 节点故障&#xff0c;能否快速切换到备份节点&#xff0c;直接决定了业务的“抗风险能力”。YMatrix 的 Mirror 机制正是实现这一目标的…

作者头像 李华
网站建设 2026/6/6 15:47:19

matlab进行利用遗传算法对天线阵列进行优化

在MATLAB中利用遗传算法&#xff08;Genetic Algorithm, GA&#xff09;对天线阵列进行优化是一种常见的方法&#xff0c;特别适用于解决多目标优化问题、天线方向图形状优化、波束形成等问题。下面将使用MATLAB的遗传算法工具箱&#xff08;Global Optimization Toolbox&#…

作者头像 李华
网站建设 2026/6/8 8:25:30

TypeScript开发基础(5)——用户信息卡片制作(数据类型应用案例)

前面已经学习了TypeScript中的常用数据类型&#xff0c;下面来看一下它们的简单应用。首先还是来看一下效果&#xff1a;每条用户信息包含id、姓名、密码、邮箱、部门、角色、加入日期及是否活跃等信息。实现步骤&#xff1a;1. 制作网页显示模板userinfo.html。这部分主要是显…

作者头像 李华