1365. 現在の数値より小さい数値はいくつありますか ●

1365. 現在の数値より小さい数値はいくつありますか ●

説明する

配列 nums が与えられた場合、各要素 nums[i] について、配列内のそれより小さいすべての数値の数を数えてください。

つまり、nums[i] ごとに、j != i および nums[j] < nums[i] となる有効な j の数を計算する必要があります。

答えを配列として返します。

入力: 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 の場合、(1、2、および 2) という 3 つの小さい数値があります。

答え

1. 暴力

各数値について、その数値未満の要素の数を 1 回トラバースして数えます。

2. 並べ替え

配列を小さいものから大きいものに並べ替えた後、(繰り返される) 要素の左端の添え字は、要素よりも小さい数値の数になります

これを行うには、nums 配列 vec をコピーし、それを並べ替えます。

次に、後ろから前に、現在の番号に対応する添字値を更新して、最後に更新された番号の添字が繰り返し要素値の左端の添字値になるようにします

次に、元の配列 nums を走査すると、cnts に対応する値は、より小さい数値の数になります

ここに画像の説明を挿入

class Solution {
    
    
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
    
    
        int cnts[101] = {
    
    0};
        int n = nums.size();
        vector<int> vec = nums;
        sort(vec.begin(), vec.end());
        for(int i = n-1; i >= 0; --i) cnts[vec[i]] = i;
        for(int i = 0; i < n; ++i){
    
    
            vec[i] = cnts[nums[i]];
        }
        return vec;
    }
};

3. カウント - プレフィックスと

要素値の範囲は 100 以内であるため、統計用のカウント配列を作成し、プレフィックスの合計を取得できます。cnts[i] は配列内の <= i の数を示し、最後に元の配列を走査して対応する答えを取得します。 cnts[nums[i]-1]。

class Solution {
    
    
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
    
    
        int cnts[101] = {
    
    0};
        vector<int> ret(nums.size(), 0);
        for(int num : nums) ++cnts[num];		// 计数
        for(int i = 1; i <= 100; ++i){
    
    
            cnts[i] += cnts[i-1];				// 前缀和,cnts[i] 表示数组中 <= i 的个数
        }
        for(int i = 0; i < nums.size(); ++i){
    
    
            ret[i] = nums[i] >= 1? cnts[nums[i]-1] : 0;		// 小于 nums[i] 的个数为cnts[nums[i]-1]
        }
        return ret;
    }
};

おすすめ

転載: blog.csdn.net/qq_19887221/article/details/127061433