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