LeetCode1365現在の数よりも小さい数

配列numsを指定します。各要素nums [i]について、配列内のそれよりも小さいすべての数値の数を数えてください。

つまり、各nums [i]について、有効なjの数を計算する必要があります。ここで、jはj!= iおよびnums [j] <nums [i]を満たします。

答えは配列として返されます。

例1:

入力:nums = [8,1,2,2,3]
出力:[4,0,1,1,3]
説明:nums
[0] = 8の場合、それよりも小さい4つの数値があります:(1、2 、2および3)。
nums [1] = 1の場合、それよりも小さい数はありません。
nums [2] = 2の場合、より小さな数があります:(1)。
nums [3] = 2の場合、より小さな数があります:(1)。
nums [4] = 3の場合、3つの小さい数値があります:(1、2、および2)。

例2:

入力:nums = [6,5,4,8]
出力:[2,1,0,3]

例3:

入力:nums = [7,7,7,7]
出力:[0,0,0,0]

促す:

2 <= nums.length <= 500
0 <= nums[i] <= 100

問題解決のアイデア:
プロンプトが表示されたら、どの方法を使用するかは誰もが知っていると思います。範囲は100のみです。バケット並べ替えを使用することをお勧めします。最初にバケット並べ替えを使用して各発生数を計算し、次にバケットをトラバースして特定の位置までカウントします。この位置の現在の数よりも小さい数は、この位置までカウントされた数です。コードは次のとおりです。

class Solution {
    
    
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
    
    
        int arr[101];
        memset(arr, 0, sizeof(arr));
        // 初始化计数桶
        for (auto i : nums) {
    
    
            arr[i] ++;
        }
        // 累加处理计数桶,使得 arr[i] 表示比 i 小的数字的个数
        int cnt = 0;
        for (int i = 0; i <= 100; i ++) {
    
    
            int temp = arr[i];
            arr[i] = cnt;
            cnt += temp;
        }
        vector<int> ret;
        // 遍历 nums,取出对应桶 arr[i] 里的结果即可
        for (int i : nums) {
    
    
            ret.push_back(arr[i]);
        }
        return ret;
    }
};

おすすめ

転載: blog.csdn.net/HERODING23/article/details/109282473