每日OJ题_分治归并③_力扣315. 计算右侧小于当前元素的个数

news/2024/5/17 15:26:31 标签: 算法, c++, 数据结构, 排序算法, 归并排序

目录

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

解析代码


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

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

难度 困难

给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量。

示例 1:

输入:nums = [5,2,6,1]
输出:[2,1,1,0] 
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素

示例 2:

输入:nums = [-1]
输出:[0]

示例 3:

输入:nums = [-1,-1]
输出:[0,0]

提示:

  • 1 <= nums.length <= 10^5
  • -10^4 <= nums[i] <= 10^4
class Solution {
public:
	vector<int> countSmaller(vector<int>& nums) {

};

解析代码

class Solution {
	vector<int> ret;
	vector<int> index; // nums中元素的原始下标
	vector<int> tmp_nums;
	vector<int> tmp_index; // 和nums里的元素绑定一起移动
public:
	vector<int> countSmaller(vector<int>& nums) {
		int n = nums.size();
		ret.resize(n);
		index.resize(n);
		tmp_nums.resize(n);
		tmp_index.resize(n);
		for (int i = 0; i < n; ++i)
		{
            index[i] = i;
        }
		mergeSortCnt(nums, 0, n - 1);
		return ret;
	}

	void mergeSortCnt(vector<int>& nums, int left, int right)
	{
		if (left >= right)
			return;
		int mid = (left + right) >> 1;
		mergeSortCnt(nums, left, mid);
		mergeSortCnt(nums, mid + 1, right);

		int cur1 = left, cur2 = mid + 1, i = 0;
		while (cur1 <= mid && cur2 <= right)
		{
			if (nums[cur1] > nums[cur2])
			{
				ret[index[cur1]] += (right - cur2 + 1);
				tmp_nums[i] = nums[cur1];
				tmp_index[i++] = index[cur1++];
			}
			else
			{
				tmp_nums[i] = nums[cur2];
				tmp_index[i++] = index[cur2++];
			}
		}
		while (cur1 <= mid)
		{
			tmp_nums[i] = nums[cur1];
			tmp_index[i++] = index[cur1++];
		}
		while (cur2 <= right)
		{
			tmp_nums[i] = nums[cur2];
			tmp_index[i++] = index[cur2++];
		}
		for (int j = left; j <= right; ++j)
		{
			nums[j] = tmp_nums[j - left];
			index[j] = tmp_index[j - left];
		}
	}
};


http://www.niftyadmin.cn/n/5402336.html

相关文章

第七十二天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第72天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点&#xff1a; 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…

AI时代编程新宠!如何让孩子成为未来的编程大师?

文章目录 一、了解编程的基础概念二、选择适合的编程工具三、激发孩子的兴趣四、注重基础能力的培养五、提供实践机会六、鼓励孩子与他人合作七、持续支持与鼓励《信息学奥赛一本通关》本书定位内容简介作者简介目录 随着科技的迅猛发展&#xff0c;编程已经从一种专业技能转变…

让两个电脑通信的方法(TCP连接,UDP连接,C/S架构)

目录 TCP-面向连接UDP-面向无连接C/S架构服务器和客户端的工作过程C/S架构例子 让两个电脑通信的方法是 在C/S的基础上&#xff0c;采用TCP和UDP的方式连接 TCP-面向连接 UDP-面向无连接 C/S架构 服务器和客户端的工作过程 C/S架构例子 服务器与客户端通信的过程类似公司与客户…

Java foreach 循环陷阱

为什么阿里的 Java 开发手册里会强制不要在 foreach 里进行元素的删除操作&#xff1f; public static void main(String[] args) {List<String> list new ArrayList<>();list.add("王二");list.add("王三");list.add("有趣的程序员&qu…

戏说c第二十六篇: 测试完备性衡量(代码覆盖率)

前言 师弟&#xff1a;“师兄&#xff0c;我又被鄙视了。说我的系统太差&#xff0c;测试不过关。” 我&#xff1a;“怎么说&#xff1f;” 师弟&#xff1a;“每次发布版本给程夏&#xff0c;都被她发现一些bug&#xff0c;太丢人了。师兄&#xff0c;有什么方法来衡量测试的…

人工智能数学验证工具LEAN4【入门介绍8】小于等于世界-证明<=是自然数的一个全序

视频链接&#xff1a;人工智能数学验证工具LEAN4【入门介绍8】小于等于世界-证明<是自然数的一个全序_哔哩哔哩_bilibili import Game.Levels.LessOrEqual.L10le_one World "LessOrEqual" Level 11 Title "le_two" namespace MyNat TheoremTab "…

C++17之std::invoke: 使用和原理探究(全)

目录 1.概述 2.辅助类 3.原理分析 4.总结 1.概述 在之前的 C 版本中&#xff0c;要调用不同类型的可调用对象&#xff0c;需要使用不同的语法&#xff0c;例如使用函数调用运算符 () 来调用函数或函数指针&#xff0c;使用成员访问运算符 -> 或 . 来调用成员函数。这样的…

vue3 日期延后一天

问题&#xff1a;提交信息时要求将所选日期延后一天进行提交解决过程&#xff1a;1.定义延后一天的计算方法&#xff0c;在提交前&#xff0c;将提交日期传入调用该方法 2.对延后的日期进行格式化&#xff0c;最后格式为yy-mm-dd解决结果&#xff1a; const…