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

简介: 力扣315计算右侧小于当前元素的个数
class Solution {
public:
    vector<int> countSmaller(vector<int>& nums) {
        vector<int>index,temp,tempindex,counts;
        index.resize(nums.size(),0);
        temp.resize(nums.size(),0);
        tempindex.resize(nums.size(),0);
        counts.resize(nums.size(),0);//需要记录下标的数组,用来保存下标。采用归并排序算法进行求解
        for(int i=0;i<nums.size();i++)index[i]=i;
        sort(nums,0,nums.size()-1,index,temp,tempindex,counts);
        return counts;
    }
    void sort(vector<int>&nums,int l,int r,vector<int>&index,vector<int>&temp,vector<int>&tempindex,vector<int>&counts){
        if(r==l)return;
        int mid = l + (r-l)/2;
        sort(nums,l,mid,index,temp,tempindex,counts);
        sort(nums,mid+1,r,index,temp,tempindex,counts);
        mergersort(nums,l,mid,r,index,temp,tempindex,counts);
    }
    void mergersort(vector<int>&nums,int l,int mid,int r,vector<int>&index,vector<int>&temp,vector<int>&tempindex,vector<int>&counts){
        int left = l,right=mid+1,cnt=0;
        while(left<=mid&&right<=r){
            if(nums[left]<=nums[right]){
                temp[cnt]=nums[left];
                tempindex[cnt]=index[left];
                counts[index[left]]+=right-mid-1;
                cnt++;
                left++;
            }
            else{
                temp[cnt] = nums[right];
                tempindex[cnt]=index[right];
                cnt++;
                right++;
            }
        }
        while(left<=mid){
            temp[cnt]=nums[left];
            tempindex[cnt]=index[left];
            counts[index[left]]+=right-mid-1;
            cnt++;
            left++;
        }
        while(right<=r){
            temp[cnt]=nums[right];
            tempindex[cnt]=index[right];
            right++;
            cnt++;
        }
        for(int n=0;n<r-l+1;n++){
            nums[n+l]=temp[n];
            index[n+l]=tempindex[n];
        }
    }
};
目录
相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
37 1
|
2月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
36 0
|
2月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
33 0
|
2月前
【LeetCode-每日一题】移除元素
【LeetCode-每日一题】移除元素
33 0
|
4月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer II 082. 含有重复元素集合的组合
解决LeetCode平台《剑指 Offer II 082. 含有重复元素集合的组合》题目的Python代码实现,通过深度优先搜索算法找出所有和为特定目标值的数字组合,并在搜索过程中通过排序和跳过重复元素来避免解集中出现重复组合。
43 2
|
4月前
|
算法
LeetCode第27题移除元素
这篇文章介绍了LeetCode第27题"移除元素"的解题方法,通过使用双指针技巧,有效移除数组中特定值的元素并返回新数组的长度。
|
4月前
|
算法 索引 Python
【Leetcode刷题Python】34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
解决LeetCode "在排序数组中查找元素的第一个和最后一个位置" 问题的方法。第一种方法是使用两次二分查找,首先找到目标值的最左边界,然后找到最右边界。第二种方法是利用Python的list.index()方法,先正序找到起始位置,再逆序找到结束位置,并给出了两种方法的Python实现代码。
66 0
|
4月前
|
Python
【Leetcode刷题Python】203.移除链表元素
文章提供了三种删除链表中特定值节点的方法:迭代法、虚拟节点迭代删除法和递归法,并给出了相应的Python实现代码。
28 0