给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质:
counts[i]
的值是nums[i]
右侧小于nums[i]
的元素的数量。示例:
输入: [5,2,6,1] 输出:[2,1,1,0] 解释:5 的右侧有 2 个更小的元素 (2 和 1). 2 的右侧仅有 1 个更小的元素 (1). 6 的右侧有 1 个更小的元素 (1). 1 的右侧有 0 个更小的元素.模拟+二分
我们从暴力模拟法为起点进一步优化,我们看到每次我们都要从末尾遍历相同的元素,实际上我们可以建立一个保持排序的数组s_num。
这个数组代表:在nums[i]之后所有的数,并且已经排好序。
每次在nums数组出现新的需要判断的数就要插入到这个s_num,然后在这个数通过二分查找到下界(可以用STL自带的lower_bound()) 减去s_num.begin()就是比nums[i]小的元素个数了class Solution { public: vector<int> countSmaller(vector<int>& nums) { vector<int>s_num; vector<int>res; for(int i=nums.size()-1;i>=0;i--) { auto iter=lower_bound(s_num.begin(),s_num.end(),nums[i]); //二分查找比nums[i]小的数 int pos=iter-s_num.begin(); s_num.insert(iter,nums[i]); /*这时nums[i]已经使用完了,需要给以后的数字拿来判断 插入后要保持sorted_num排序,所以nums[i]插入到iter位置*/ res.push_back(pos); } reverse(res.begin(),res.end()); return res; } };
Leetcode 315. 计算右侧小于当前元素的个数 思维
最新推荐文章于 2022-04-30 15:12:46 发布