样例
对于数组 [1,2,7,8,5]
,查询 [1,8,5]
,返回 [0,4,2]
思路1:先构造出一个符合问题查询需求的线段树。也就是区间内小于某数的值得个数作为额外属性;
在这里,求得额外属性的时候,可以借鉴线段树构造||中构造的最大值的线段树。
思路2:这题没有必要用线段树,写起来多麻烦,可以直接二分查找,代码简洁才是王道;
先做排序,然后查询;这里直接调用lower_bound函数;
函数lower_bound()在begint和end中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。
在这里,求得额外属性的时候,可以借鉴线段树构造||中构造的最大值的线段树。
思路2:这题没有必要用线段树,写起来多麻烦,可以直接二分查找,代码简洁才是王道;
先做排序,然后查询;这里直接调用lower_bound函数;
函数lower_bound()在begint和end中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。
class Solution { public: /** * @param A: An integer array * @return: The number of element in the array that * are smaller that the given integer */ /* 思路1:先构造出一个符合问题查询需求的线段树。也就是区间内小于某数的值得个数作为额外属性; 在这里,求得额外属性的时候,可以借鉴线段树构造||中构造的最大值的线段树。 思路2:这题没有必要用线段树,写起来多麻烦,可以直接二分查找,代码简洁才是王道; 先做排序,然后查询;这里直接调用lower_bound函数; 函数lower_bound()在begint和end中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。 */ vector<int> countOfSmallerNumber(vector<int> &A, vector<int> &queries) { // write your code here sort(A.begin(),A.end()); vector<int> ret; for(int q:queries){ int cnt = lower_bound(A.begin(),A.end(),q)-A.begin(); ret.push_back(cnt); } return ret; } };