您的位置:首页 > 产品设计 > UI/UE

315. Count of Smaller Numbers After Self(第四周)

2017-03-17 22:14 337 查看
Description:

You are given an integer array nums and you have to return a new counts array. The counts array has the property where 
counts[i]
 is
the number of smaller elements to the right of 
nums[i]
.

Example:
Given nums = [5, 2, 6, 1]

To the right of 5 there are 2 smaller elements (2 and 1).
To the right of 2 there is only 1 smaller element (1).
To the right of 6 there is 1 smaller element (1).
To the right of 1 there is 0 smaller element.


Return the array 
[2, 1, 1, 0]
.

Subscribe to see which companies asked this question.

解题思路:
这道题用O(n^2)遍历是不太现实的,这题是放在分治算法分类当中的,则应该考虑O(nlogn)的分治,思路是将这个数组不断的分治下去,直到每个最小的都有两个及以上的元素,然后再对这些小数组找到各自在当中符合要求的大小,找完之后排序,回归上一层。
class Solution{
public:
void mergeSort(vector<pair<int,int> >&nums, int low, int high, vector<int>&res)
{
if(low+1 == high) return;
int mid = (low + high)/2, right = mid;
mergeSort(nums,low,mid,res);
mergeSort(nums,mid,high,res);
for(int i = low; i < mid; i++){
while(right < high && nums[i].first > nums[right].first) right++;
res[nums[i].second] += right - mid;
}
inplace_merge(nums.begin()+low, nums.begin()+mid, nums.begin()+right);
}
vector<int> countSmaller(vector<int>& nums) {
int size = nums.size();
if(size == 0) return nums;
vector<int>res(size,0);
vector<pair<int, int> >a;
for(int i = 0; i < size; i++)
a.push_back(make_pair(nums[i],i));
mergeSort(a,0,size,res);
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  divide and conquer