题目简介:
给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i]
的值是 nums[i]
右侧小于 nums[i]
的元素的数量。
示例:
1 2 3 4 5 6 7
| 输入: [5,2,6,1] 输出: [2,1,1,0] 解释: 5 的右侧有 2 个更小的元素 (2 和 1). 2 的右侧仅有 1 个更小的元素 (1). 6 的右侧有 1 个更小的元素 (1). 1 的右侧有 0 个更小的元素.
|
思路:
一开始直接用暴力法,然后很顺其自然的挂了。
后来用了二分查找,即从后往前遍历,每次将遍历到的元素与sorted_arr
中的元素进行比较,从而得出右侧小于当前元素的个数,最后将该元素放置到sorted_arr
的正确位置,使sorted_arr
为升序排序。
tips:
- 用了二分后,虽然时间复杂度降低了,但还是很慢,勉强AC题目。
- 这题官方方法应该用归并排序来做,先mark一下。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: vector<int> countSmaller(vector<int>& nums) {
if(nums.empty()) return {};
vector<int> counts(nums.size(), 0); vector<int> sorted_arr(1, nums[nums.size() - 1]);
for(int i = nums.size() - 2; i >= 0; i--){ int left = 0; int right = sorted_arr.size() - 1;
while(left <= right){
int mid = (right - left) + left / 2;
if(sorted_arr[mid] >= nums[i]) right = mid - 1; else left = mid + 1; }
counts[i] = left; sorted_arr.insert(sorted_arr.begin() + left, nums[i]); }
return counts; } };
|