https://leetcode.com/problems/how-many-numbers-are-smaller-than-the-current-number/

1. Use 2 pointers:

  1. //12 ms 10.4 MB
  2. class Solution {
  3. public:
  4. vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
  5. vector<int> sorted = nums;
  6. int n = nums.size();
  7. sort(sorted.begin(), sorted.end());
  8. int j;
  9. for(int i = 0; i < n; i++){
  10. j = findIdx(nums[i], sorted, 0, n-1);
  11. nums[i] = j;
  12. }
  13. return nums;
  14. }
  15. private:
  16. //at first, l = 0, r = list.size() - 1;
  17. int findIdx(int num, vector<int>& list, int l, int r){
  18. int m = l + (r-l) / 2;
  19. if(list[m] == num){
  20. while(m > 0){
  21. if(list[m-1]==list[m])
  22. m--;
  23. else
  24. break;
  25. }
  26. return m;
  27. } else if(list[m] > num){
  28. return findIdx(num, list, l, m - 1);
  29. } else if(list[m] < num){
  30. return findIdx(num, list, m + 1, r);
  31. }
  32. return m;
  33. }
  34. };

2. Use STL methods:

  1. //136 ms 10.2 MB
  2. class Solution {
  3. public:
  4. vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
  5. vector<int> sorted = nums;
  6. int n = nums.size();
  7. sort(sorted.begin(), sorted.end());
  8. int dist;
  9. for(int i = 0; i < n; i++){
  10. for(vector<int>::iterator it = sorted.begin(); it != sorted.end(); it++){
  11. if(*it == nums[i]){
  12. dist = distance(sorted.begin(), it);
  13. nums[i] = dist;
  14. break;
  15. }
  16. }
  17. }
  18. return nums;
  19. }
  20. };