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