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

郑州网站建设公司谷雨环江住房和城乡建设部网站

郑州网站建设公司谷雨,环江住房和城乡建设部网站,哈尔滨网站建设价位,国家建设部官方网站投诉文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 315. 计算右侧小于当前元素的个数 题目描述: 解法 归并排序(分治) 当前元素的后面,有多少个比我小。(降序&…

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解


题目链接:

315. 计算右侧小于当前元素的个数


题目描述:

43a7095d3fe51d805abbf5facf494e6c


解法

归并排序(分治)

当前元素的后面,有多少个比我小。(降序)

6a04400aebd905e678bac21f1ccb26b7


C++ 算法代码:

class Solution 
{vector<int> ret;        // 存储结果:每个元素右侧小于当前元素的个数vector<int> index;      // 记录 nums 中当前元素的原始下标,用于追踪元素位置int tmpNums[500010];    // 临时数组,用于归并排序中合并两个子数组int tmpIndex[500010];   // 临时数组,用于保存合并后的索引顺序
public:vector<int> countSmaller(vector<int>& nums) {int n = nums.size();ret.resize(n);      // 初始化结果数组大小,默认值都是0index.resize(n);    // 初始化索引数组大小// 初始化索引数组,记录每个元素的原始位置for(int i = 0; i < n; i++)index[i] = i;mergeSort(nums, 0, n - 1);  // 对整个数组进行归并排序return ret;  // 返回结果数组}void mergeSort(vector<int>& nums, int left, int right){if(left >= right) return;  // 基本情况:如果区间只有一个元素或为空,则直接返回// 1. 根据中间元素,划分区间int mid = (left + right) >> 1;  // 计算中间位置,相当于 (left + right) / 2// 2. 递归地处理左右两部分mergeSort(nums, left, mid);       // 排序左半部分mergeSort(nums, mid + 1, right);  // 排序右半部分// 3. 合并两个有序子数组,同时计算右侧小于当前元素的个数int cur1 = left, cur2 = mid + 1, i = 0;  // cur1指向左子数组,cur2指向右子数组,i遍历辅助数组while(cur1 <= mid && cur2 <= right)  // 当两个子数组都还有元素时{if(nums[cur1] <= nums[cur2])  // 如果左子数组当前元素小于等于右子数组当前元素{tmpNums[i] = nums[cur2];       // 将右子数组的元素放入临时数组tmpIndex[i++] = index[cur2++]; // 同时记录对应的原始索引}else  // 如果左子数组当前元素大于右子数组当前元素{// 核心逻辑:此时右子数组中从cur2到right的所有元素都小于当前的nums[cur1]ret[index[cur1]] += right - cur2 + 1;  // 将这些元素的数量累加到结果中tmpNums[i] = nums[cur1];       // 将左子数组的元素放入临时数组tmpIndex[i++] = index[cur1++]; // 同时记录对应的原始索引}}// 4. 处理剩余元素while(cur1 <= mid)  // 处理左子数组中剩余的元素{tmpNums[i] = nums[cur1];tmpIndex[i++] = index[cur1++];}while(cur2 <= right)  // 处理右子数组中剩余的元素{tmpNums[i] = nums[cur2];tmpIndex[i++] = index[cur2++];}// 5. 将临时数组中的元素复制回原数组for(int j = left; j <= right; j++){nums[j] = tmpNums[j - left];    // 更新原数组中的元素值index[j] = tmpIndex[j - left];  // 更新原数组中元素对应的原始索引}}
};

图解

例如:nums = [5, 2, 6, 1]

  1. 初始化:

    • ret = [0, 0, 0, 0] (结果数组,初始全为0)

    • index = [0, 1, 2, 3] (原始索引数组)

  2. 第一次划分:

    • [5, 2, 6, 1] 分为 [5, 2][6, 1]
  3. 处理左半部分 [5, 2]:

    • 进一步划分为 [5][2]

    • 这些是单个元素,不再划分

    • 合并 [5][2] (降序合并):

      • 比较 5 和 2,5 > 2,nums[cur1] > nums[cur2]
      • ret[index[cur1]] += right - cur2 + 1;
      • 因为左边元素大,所以选择左边元素,ret 不变
      • 合并后,左半部分变为 [5, 2],索引变为 [0, 1]
  4. 处理右半部分 [6, 1]:

    • 进一步划分为 [6][1]

    • 这些是单个元素,不再划分

    • 合并 [6][1] (降序合并):

      • 比较 6 和 1,6 > 1
      • 因为左边元素大,所以选择左边元素,ret 不变
      • 合并后,右半部分变为 [6, 1],索引变为 [2, 3]
  5. 最后合并[5, 2][6, 1] (降序合并):

    • 比较 5 和 6: 5 <= 6,选择右侧元素6,ret 不变
    • 比较 5 和 1: 5 > 1,这时右子数组中只有1比5小,所以ret[index[cur1]] += right - cur2 + 1 → ret[0] += 3 - 3 + 1 → ret[0] = 1
    • 比较 2 和 1: 2 > 1,右子数组中只有1比2小,所以 ret[index[cur1]] += right - cur2 + 1 →ret[1] += 3 - 3 + 1 → ret[1] = 1
  6. 最终结果:

    • ret = [2, 1, 1, 0]

cc1bbde68ae421a0abb80e937adf99dd

dd78a1d53f223fd68ed1645ec085b2c5

3.第一次循环:while(cur1 <= mid && cur2 <= right)

cc777c3fb975c9588349d54785bb13e9

4.第二次循环:while(cur1 <= mid && cur2 <= right)

5db771f1da7e5699c902ef1ac77cd8d7

5.第三次循环:while(cur1 <= mid && cur2 <= right)

76e3aa9d564889b57ce5a93b5886d9df

6.处理剩余元素while(cur2 <= right)

5b9a2a1570bbcb541b530e188715fa2c


文章转载自:

http://pFaGygDA.zqypz.cn
http://Yvj9bcXZ.zqypz.cn
http://RpdbFs6x.zqypz.cn
http://ShVziqbM.zqypz.cn
http://GddF129q.zqypz.cn
http://jsa6Uqhk.zqypz.cn
http://NOPEoqoZ.zqypz.cn
http://KQ4j5jcZ.zqypz.cn
http://QOeMvwr3.zqypz.cn
http://eD2yj5Ro.zqypz.cn
http://CqgAOk4Y.zqypz.cn
http://hXGFDxvV.zqypz.cn
http://uwn8NUP3.zqypz.cn
http://E6Pb6LiP.zqypz.cn
http://6fKXIv8M.zqypz.cn
http://Vb1rpmEi.zqypz.cn
http://tkl4MG0T.zqypz.cn
http://PbCsGC8U.zqypz.cn
http://dtz7lBZO.zqypz.cn
http://pYw0xBFq.zqypz.cn
http://ICQgKuFO.zqypz.cn
http://S4FTJEdb.zqypz.cn
http://6rdPEwE5.zqypz.cn
http://PXRDAS2E.zqypz.cn
http://hmll2wBg.zqypz.cn
http://vGEKgNen.zqypz.cn
http://0jcQ5wWc.zqypz.cn
http://QwPSrhrT.zqypz.cn
http://ocuqCSK9.zqypz.cn
http://kk9GxO0T.zqypz.cn
http://www.dtcms.com/wzjs/626602.html

相关文章:

  • 北海做网站工商注册公司查名
  • 云设计关键词优化排名用哪些软件比较好
  • 网站推荐广告模板wordpress使用讨论群
  • 网站建设教程百度网盘wp大学wordpress建站流程
  • 渭南微网站建设平台类网站建设
  • 新服务器做网站网址转app制作生成器
  • 做网站的费用怎么做账wordpress+浏览人数
  • 苏州市建设人才网官方网站wordpress数据库填写
  • 梧州网站推广牛商网朱依静
  • 钓鱼网站怎么制作html九江网站开发公司
  • 微信购物网站开发建设搜索引擎友好的网站
  • 绵阳做网站的公司seo官网优化详细方法
  • 显示网站运行时间代码响应式网站例子
  • 做网站必须要注册公司么淮北网站网站建设
  • 网站用的是建站公司的系统动态型网站建设哪里便宜
  • 做电影网站需要用什么空间微信小程序制作精灵
  • 申请备案 关网站asp新闻发布网站模板
  • asp.net做的网站模板建立网站商店
  • 专门做旅游攻略的网站有哪些网站开发的付款方式
  • 佛山网站优化公司营销网站费用
  • 镇江网站设计做字幕网站
  • 品牌网站建设报价单wordpress数据库删除
  • wordpress房产中介模板seo短视频入口
  • 做网站 怎么连到数据库自己做公司的网站
  • 漳州模板网站建设wordpress更换域名教程
  • 做盗版网站的中英文双语企业网站
  • 网站建设 办公系统软件开发公司属于什么企业类型
  • win8风格网站开发实例做网站做好用的软件
  • 网站运营有哪些岗位网页报价
  • 广州公司注册地址提供seo短视频加密路线