当前位置:   article > 正文

LetCode 315. 计算右侧小于当前元素的个数(二分搜索)_315. 计算右侧小于当前元素的个数 二分插入讲解

315. 计算右侧小于当前元素的个数 二分插入讲解

给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量。

示例:

输入: [5,2,6,1]
输出: 
  1. [2,1,1,0]
  2. 解释:
5 的右侧有 2 个更小的元素 (2 和 1). 2 的右侧仅有 1 个更小的元素 (1). 6 的右侧有 1 个更小的元素 (1). 1 的右侧有 0 个更小的元素.
  1. 思路:我们将每个遍历到的数都升序存入一个容器里,在遍历接下来的一个数时,二分在这个容器里查找它能插入的位置,这样就可以得到比它小的数字个数
  1. class Solution {
  2. public:
  3. vector<int> countSmaller(vector<int>& nums) {
  4. vector<int> counts(nums.size());
  5. vector<int> trans;
  6. if (nums.size() == 0)
  7. return counts;
  8. trans.push_back(nums[nums.size() - 1]);
  9. for (int i = nums.size() - 2; i >= 0; i--) {
  10. // 这里二分我们用STL里的就好了
  11. auto it = lower_bound(trans.begin(), trans.end(), nums[i]);
  12. counts[i] = it - trans.begin();
  13. trans.insert(it, nums[i]);
  14. }
  15. return counts;
  16. }
  17. };
  1. class Solution {
  2. public:
  3. struct node
  4. {
  5. int Element;
  6. int Nums;
  7. int Element_nums;
  8. node *Left;
  9. node *Right;
  10. node(int ele) :Element(ele), Element_nums(1), Nums(0), Left(nullptr), Right(nullptr) {};
  11. node() {};
  12. };
  13. void insert(node* rt, node* p, int& cnt) {
  14. while (p != rt) {
  15. if (p->Element < rt->Element) {
  16. if (rt->Left == nullptr)
  17. rt->Left = p;
  18. rt->Nums++;
  19. rt = rt->Left;
  20. }
  21. else if (p->Element > rt->Element) {
  22. if (rt->Right == nullptr)
  23. rt->Right = p;
  24. cnt += (rt->Nums + rt->Element_nums);
  25. rt = rt->Right;
  26. }
  27. else if (p->Element == rt->Element) {
  28. rt->Element_nums++;
  29. cnt += rt->Nums;
  30. rt = p;
  31. }
  32. }
  33. }
  34. vector<int> countSmaller(vector<int>& nums) {
  35. vector<int> counts(nums.size());
  36. if (nums.size() == 0)
  37. return counts;
  38. node* root = new node(nums[nums.size() - 1]);
  39. for (int i = nums.size() - 2; i >= 0; i--)
  40. insert(root, new node(nums[i]), counts[i]);
  41. return counts;
  42. }
  43. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/227643
推荐阅读
相关标签
  

闽ICP备14008679号