zl程序教程

您现在的位置是:首页 >  后端

当前栏目

594. 最长和谐子序列-快速排序

序列排序 快速 最长
2023-09-14 09:06:54 时间

594. 最长和谐子序列-快速排序

和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。

现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。

数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。

示例 1:

输入:nums = [1,3,2,2,5,2,3,7]
输出:5
解释:最长的和谐子序列是 [3,2,2,2,3]

示例 2:

输入:nums = [1,2,3,4]
输出:2

示例 3:

输入:nums = [1,1,1,1]
输出:0

解题代码如下:

void quick(int *a,int low,int high){
    if(low<high){
        int l=low,h=high,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(a,l,low-1);
        quick(a,low+1,h);
    }
}

int findLHS(int* nums, int numsSize){
    quick(nums,0,numsSize-1);
    int max=0;
    
    for(int i=0;i<numsSize;){
   
        int start=nums[i];
        int index=i;
        int next=-1;
        for(;i<numsSize;){
            if(nums[i]<=start+1){
                i++;
            }
            else{
                break;

            }
            if(i<numsSize){
                if(nums[i]!=start&&next==-1){
                next=i;

            }

            }
            
        }
       
      
        if(nums[i-1]!=start)
        max=fmax(i-index,max);
        if(next!=-1){
           
             i=next;

        }
        
    }
    return max;

}