您好,欢迎来到年旅网。
搜索
您的当前位置:首页315. Count of Smaller Numbers After Self(第四周)

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].

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


因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务