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

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;
		}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值