当前位置: 首页 > news >正文

分治-归并-315.计算右侧小于当前元素的个数-力扣(LeetCode)

一、题目解析

1、统计右侧小于当前元素的个数

2、将个数填入到与当前元素对应下边的结果数组中

3、nums的最大长度为10^5

二、算法原理

解法1:暴力解法(该解法必然超时,不过多赘述)

固定一个数,向后遍历扫描,时间复杂度O(N^2)

解法2:归并排序(分治)

对于一个数组,以中心mid划分,左端点记作left,右端点记作right,将其分为两块[left,mid]和[mid+1,right],然后继续二分,直到只有一个元素时返回

这里给出一个结论:记暴力遍历后所得小于当前元素个数为x,在分治中将数组分为两块,在左边所得小于当前元素个数为a,在右边所得小于当前元素个数为b,一左一右所得小于当前元素个数为c。x=a+b+c

证明也很好证明,我们左,右,一左一右的本质也是暴力遍历,只不过我们利用了分治-归并的思想

一左一右处理(元素成降序排列)

处理下标问题

由于处理下标,所以在上面排序时也需要对下标进行处理

细节问题:

1、返回结果的vector<int> ret,和int index[100005],int tmpNums[100005],     int tmpIndex[100005],需要在全局开辟四个数组,为了节省参数传递

2、对于一左一右三指针处理,判断条件可能会导致某一区间未遍历完,所以需要特俗处理,并处理下标和元素

3、最后需要根据tmpNums和tmpIndex更新nums和index的内容

三、代码示例

解法2:

class Solution {vector<int> ret;int index[100005],tmpNums[100005],tmpIndex[100005];
public:vector<int> countSmaller(vector<int>& nums){ret.resize(nums.size());for(int i = 0;i<nums.size();i++){index[i] = i;//处理下标数组}mergeSort(nums,0,nums.size()-1);return ret;}void mergeSort(vector<int>& nums,int left,int right){if(left>=right) return;//分成两块int mid = (left+right)>>1;//分治mergeSort(nums,left,mid);mergeSort(nums,mid+1,right);//一左一右int cur1 = left,cur2 = mid+1,i = 0;while(cur1<=mid && cur2<=right){if(nums[cur1]<=nums[cur2]){tmpIndex[i] = index[cur2];tmpNums[i++] = nums[cur2++];}else{ret[index[cur1]] += right-cur2+1;tmpIndex[i] = index[cur1];tmpNums[i++] = nums[cur1++];}}//未完成遍历while(cur1<=mid){tmpIndex[i] = index[cur1];tmpNums[i++] = nums[cur1++];}while(cur2<=right){tmpIndex[i] = index[cur2];tmpNums[i++] = nums[cur2++];}//还原for(int i = left;i<=right;i++){nums[i] = tmpNums[i-left];index[i] = tmpIndex[i-left];}}
};

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!

http://www.lryc.cn/news/623784.html

相关文章:

  • C++ vector的使用
  • C语言(12)——进阶函数
  • 北京JAVA基础面试30天打卡12
  • 语音转文字,如何提升内容创作效率?
  • 智能汽车领域研发,复用云原始开发范式?
  • WebSocket--精准推送方案(二):实时消息推送-若依项目示例
  • 在职老D渗透日记day19:sqli-labs靶场通关(第26a关)get布尔盲注 过滤or和and基础上又过滤了空格和注释符 ‘)闭合
  • 【架构师从入门到进阶】第五章:DNSCDN网关优化思路——第十一节:网关安全-对称与非对称加密
  • 告别“测试滞后”:AI实时测试工具在敏捷开发中的落地经验
  • 【165页PPT】锂电池行业SAP解决方案(附下载方式)
  • 自动驾驶中的传感器技术34——Lidar(9)
  • 定时器中断点灯
  • 记一次安装OpenStack(Stein)-nova报错问题解决
  • 42 C++ STL模板库11-容器4-forward_list
  • 利用标准IO实现寻找文件中字符出现最多次数
  • Opencv 形态学与梯度运算
  • python的软件工程与项目管理课程组学习系统
  • 【LeetCode题解】LeetCode 33. 搜索旋转排序数组
  • Android studio gradle有关设置
  • 一周学会Matplotlib3 Python 数据可视化-多子图及布局实现
  • java之 junit4单元测试Mockito的使用
  • 魔改chromium源码——解除 iframe 的同源策略
  • 《Nursing Research》(护理SCI)LaTeX模板详细教程:从入门到投稿(一)
  • 深度解析 Spring Bean 生命周期
  • Microsoft WebView2
  • SQL详细语法教程(四)约束和多表查询
  • 网络常识-我的电脑啥时安装了证书
  • 【力扣热题100】双指针—— 接雨水
  • 【AI智能体】Dify 搭建发票识别助手操作实战详解
  • 微信小程序 小白gps工具v0.01 使用说明