2294. 划分数组使最大差为 K-快速排序

2294. 划分数组使最大差为 K-快速排序

给你一个整数数组 nums 和一个整数 k 。你可以将 nums 划分成一个或多个 子序列 ,使 nums 中的每个元素都 恰好 出现在一个子序列中。

在满足每个子序列中最大值和最小值之间的差值最多为 k 的前提下,返回需要划分的 最少 子序列数目。

子序列 本质是一个序列,可以通过删除另一个序列中的某些元素(或者不删除)但不改变剩下元素的顺序得到。

示例 1:

输入:nums = [3,6,1,2,5], k = 2
输出:2
解释:
可以将 nums 划分为两个子序列 [3,1,2] 和 [6,5] 。
第一个子序列中最大值和最小值的差值是 3 - 1 = 2 。
第二个子序列中最大值和最小值的差值是 6 - 5 = 1 。
由于创建了两个子序列,返回 2 。可以证明需要划分的最少子序列数目就是 2 。

示例 2:

输入:nums = [1,2,3], k = 1
输出:2
解释:
可以将 nums 划分为两个子序列 [1,2] 和 [3] 。
第一个子序列中最大值和最小值的差值是 2 - 1 = 1 。
第二个子序列中最大值和最小值的差值是 3 - 3 = 0 。
由于创建了两个子序列,返回 2 。注意,另一种最优解法是将 nums 划分成子序列 [1] 和 [2,3] 。

示例 3:

输入:nums = [2,2,4,5], k = 0
输出:3
解释:
可以将 nums 划分为三个子序列 [2,2]、[4] 和 [5] 。
第一个子序列中最大值和最小值的差值是 2 - 2 = 0 。
第二个子序列中最大值和最小值的差值是 4 - 4 = 0 。
第三个子序列中最大值和最小值的差值是 5 - 5 = 0 。
由于创建了三个子序列,返回 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