首页 > 其他分享 >[LeetCode] 315. 计算右侧小于当前元素的个数

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

时间:2024-10-13 14:17:19浏览次数:8  
标签:nums int 个数 315 vector 数组 counts LeetCode left

题目描述:

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

题目链接:

. - 力扣(LeetCode)

题目主要思路:

其实跟 “LCR170. 交易逆序对的总数” 那道题差不多,就是多了个数组来记录原始的index,因为counts[i]的值是nums[i]右侧小于nums[i]的元素的数量,建议先理解 “LCR170. 交易逆序对的总数” 这道题的解题思路后再挑战该题。

LCR170. 交易逆序对的总数题目思路及链接:[LeetCode] LCR170. 交易逆序对的总数-CSDN博客

解题代码:

class Solution {
public:
    vector<int> counts; // 返回的数组
    vector<int> index;  // 记录原始下标的数组
    int tmpNums[500010];
    int tmpIndex[500010];
    vector<int> countSmaller(vector<int>& nums) {
        counts.resize(nums.size());
        index.resize(nums.size());
        for (int i = 0; i < nums.size()-1; ++i) {
            index[i] = i;
        }
        mergeSort(nums, 0, nums.size()-1);
        return counts;
    }
    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]) {
                tmpNums[i] = nums[cur2];
                tmpIndex[i++] = index[cur2++];  // 记录更换位置后nums[i]原本的index
            }
            else{
                counts[index[cur1]] += right-cur2+1;
                tmpNums[i] = nums[cur1];
                tmpIndex[i++] = index[cur1++];  // 记录更换位置后nums[i]原本的index
            }
        }
        while (cur1 <= mid) {
            tmpNums[i] = nums[cur1];
            tmpIndex[i++] = index[cur1++];  // 记录更换位置后nums[i]原本的index
        }
        while (cur2 <= right) {
            tmpNums[i] = nums[cur2];
            tmpIndex[i++] = index[cur2++];  // 记录更换位置后nums[i]原本的index
        }

        for (int i = left; i <= right; ++i) {
            nums[i] = tmpNums[i-left];
            index[i] = tmpIndex[i-left];  // 将记录更换位置后的原始index写入到index数组中
        }
    }
};

标签:nums,int,个数,315,vector,数组,counts,LeetCode,left
From: https://blog.csdn.net/weixin_65043441/article/details/142774487

相关文章

  • Leetcode 1203. 项目管理
    1.题目基本信息1.1.题目描述有n个项目,每个项目或者不属于任何小组,或者属于m个小组之一。group[i]表示第i个项目所属的小组,如果第i个项目不属于任何小组,则group[i]等于-1。项目和小组都是从零开始编号的。可能存在小组不负责任何项目,即没有任何项目属于这个小组。请......
  • 2024-2025-1 学号20241315《计算机基础与程序设计》第三周学习总结
    作业信息这个作业属于哪个课程[2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03这个作业的目标加入云班课,参考本周学习资源。自学教材:计算机科......
  • Leetcode--位运算
     小伙伴们,大家好。今天给大家介绍一下位运算。 首先给大家介绍一下常用的位运算符号: &(按位与) |(按位或)^(按位异或)<<(左移)>>(右移) 以a=4,b=6为例: 4的二进制为100,6的二进制为110(假设前名的0省略) a&b=100(每一位进行运算时如果均为1则该位为1否则为0) a|b=110(每......
  • 代码随想录Day24 | LeetCode 122. 买卖股票的最佳时机 II、LeetCode 55. 跳跃游戏、Le
    LeetCode122.买卖股票的最佳时机IIclassSolution:defmaxProfit(self,prices:List[int])->int:res=0foriinrange(1,len(prices)):res+=max(0,prices[i]-prices[i-1])returnresLeetCode55.跳跃游戏class......
  • Leetcode 贪心算法之 Container With Most Water
    题目描述给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例:输入:[1,8,6,2,5,4,8,3,7]输......
  • Leetcode 贪心算法之Jump Game II
    题目描述给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处:0<=j<=nums[i]i+j<n返回到达nums[n-1]的最小跳跃次数。生成的......
  • 【JavaScript】LeetCode:61-65
    文章目录61课程表62实现Trie(前缀树)63全排列64子集65电话号码的字母组合61课程表Map+BFS拓扑排序:将有向无环图转为线性顺序。遍历prerequisites:1.数组记录每个节点的入度,2.哈希表记录依赖关系。n=6,prerequisites=[[3,0],[3,1],[4,1],[4,2],[5,3],[5,4]]。0、1......
  • leetcode 179. Largest Number
    179.LargestNumber要比较拼接以后谁应该放在前面,先试着把他们拼起来就行了然后因为正着拼和反着拼,长度一致,所以自带的string比较函数会严格比较他们的大小关系,不会因为字符串长度而误判boolcmp(constint&a,constint&b);classSolution{public:std::string......
  • 代码随想录训练营第五天|Leetcode.349,Leetcode.454,Leetcode19,Leetcode18
    一、哈希表和set和map和数组的关系 用哈希表,判断是否出现过。数值很大或者数值很分散时,不用数组,占用空间大,用set。set,multiset数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判......
  • Leetcode 1192. 查找集群内的关键连接
    1.题目基本信息1.1.题目描述力扣数据中心有n台服务器,分别按从0到n-1的方式进行了编号。它们之间以服务器到服务器的形式相互连接组成了一个内部集群,连接是无向的。用connections表示集群网络,connections[i]=[a,b]表示服务器a和b之间形成连接。任何服务器都可......