2294. 最大の差が K クイックソートになるように配列を分割する

2294. 最大の差が K クイックソートになるように配列を分割する

整数配列 nums と整数 k が与えられます。nums を 1 つ以上のサブシーケンスに分割して、nums の各要素が 1 つのサブシーケンスに現れるようにすることができます。

各部分列の最大値と最小値の差が k 以下であることを前提として、分割する必要がある最小の部分列の数を返します。

サブシーケンスは本質的に、残りの要素の順序を変更せずに、別のシーケンスから一部の要素を削除する (または削除しない) ことによって取得できるシーケンスです。

例 1:

入力: nums = [3,6,1,2,5]、k = 2
出力: 2
説明:
nums は 2 つの部分列 [3,1,2] と [6,5] に分割できます。
最初のサブシーケンスの最大値と最小値の差は 3 - 1 = 2 です。
2 番目のサブシーケンスの最大値と最小値の差は 6 - 5 = 1 です。
2 つのサブシーケンスが作成されたため、2 が返されます。分割する必要がある部分列の最小数は 2 であることが証明できます。

例 2:

入力: nums = [1,2,3]、k = 1
出力: 2
説明:
nums は 2 つの部分列 [1,2] と [3] に分割できます。
最初のサブシーケンスの最大値と最小値の差は 2 - 1 = 1 です。
2 番目のサブシーケンスの最大値と最小値の差は 3 - 3 = 0 です。
2 つのサブシーケンスが作成されたため、2 が返されます。別の最適な解決策は、nums をサブシーケンス [1] と [2,3] に分割することであることに注意してください。

例 3:

入力: nums = [2,2,4,5]、k = 0
出力: 3
説明:
nums は 3 つの部分列 [2,2]、[4]、[5] に分割できます。
最初のサブシーケンスの最大値と最小値の差は 2 - 2 = 0 です。
2 番目のサブシーケンスの最大値と最小値の差は 4 - 4 = 0 です。
3 番目のサブシーケンスの最大値と最小値の差は 5 - 5 = 0 です。
3 つのサブシーケンスが作成されたため、3 が返されます。分割する必要がある部分列の最小数は 3 であることが証明できます。

解決策のコードは次のとおりです。




void quick_sort(int *a,int low,int high){
    
    
    int l=low,h=high;
    if(low<high){
    
    
        int p=a[low];
        while(low<high){
    
    
            while(low<high&&a[high]>=p){
    
    
                high--;

            }
            a[low]=a[high];
            while(low<high&&a[low]<=p){
    
    
                low++;
            }
            a[high]=a[low];
        }
        a[low]=p;
        quick_sort(a,l,low-1);
        quick_sort(a,low+1,h);

    }
}


int cmp(int* a, int* b){
    
    
    return *a - *b;
}

int partitionArray(int* nums, int numsSize, int k){
    
    
   qsort(nums, numsSize, sizeof(int), cmp);
    int count=0;
    int init_n=nums[0];
    for(int i=1;i<numsSize;i++){
    
    
        if(nums[i]-init_n>k){
    
    
            count++;
            init_n=nums[i];

        }

    }
    return count+1;

}

おすすめ

転載: blog.csdn.net/weixin_43327597/article/details/133308793