2150. 找出数组中的所有孤独数字-快速排序

2150. 找出数组中的所有孤独数字

给你一个整数数组 nums 。如果数字 x 在数组中仅出现 一次 ,且没有 相邻 数字(即,x + 1 和 x - 1)出现在数组中,则认为数字 x 是 孤独数字 。

返回 nums 中的 所有 孤独数字。你可以按 任何顺序 返回答案。

示例 1:

输入:nums = [10,6,5,8]
输出:[10,8]
解释:

  • 10 是一个孤独数字,因为它只出现一次,并且 9 和 11 没有在 nums 中出现。
  • 8 是一个孤独数字,因为它只出现一次,并且 7 和 9 没有在 nums 中出现。
  • 5 不是一个孤独数字,因为 6 出现在 nums 中,反之亦然。
    因此,nums 中的孤独数字是 [10, 8] 。
    注意,也可以返回 [8, 10] 。

示例 2:

输入:nums = [1,3,5,3]
输出:[1,5]
解释:

  • 1 是一个孤独数字,因为它只出现一次,并且 0 和 2 没有在 nums 中出现。
  • 5 是一个孤独数字,因为它只出现一次,并且 4 和 6 没有在 nums 中出现。
  • 3 不是一个孤独数字,因为它出现两次。
    因此,nums 中的孤独数字是 [1, 5] 。
    注意,也可以返回 [5, 1] 。

这一题,排序之后,我们在对其元素进行逐个遍历即可:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */


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* findLonely(int* nums, int numsSize, int* returnSize){
    // for(int i=1;i<numsSize;i++){
    //     int t=nums[i];
    //     int j;
    //     for( j=i-1;j>=0;j--){
    //         if(nums[j]>t){
    //             nums[j+1]=nums[j];
    //         }
    //         else{
    //             nums[j+1]=t;
    //             break;
    //         }
    //     }
    //     if(j==-1){
    //         nums[0]=t;
    //     }
    // }
    if(numsSize==1){
        *returnSize=1;
        return nums;
    }
    quick_sort(nums,0,numsSize-1);
    int p=0;
    for(int i=0;i<numsSize;i++){
        printf("%d ",nums[i]);
        if(i==0){
            if(nums[i+1]!=nums[i]+1&&nums[i+1]!=nums[i]-1&&nums[i+1]!=nums[i]){
                nums[p++]=nums[i];
            }
        }
        else if(i==numsSize-1){
            if(nums[i-1]!=nums[i]+1&&nums[i-1]!=nums[i]-1&&nums[i-1]!=nums[i]){
                nums[p++]=nums[i];
            }

        }
        else{
            if(nums[i-1]!=nums[i]+1&&nums[i-1]!=nums[i]-1&&nums[i+1]!=nums[i]+1&&nums[i+1]!=nums[i]-1&&nums[i]!=nums[i+1]&&nums[i]!=nums[i-1]){
                nums[p++]=nums[i];
            }

        }
    }
    *returnSize=p;
    return nums;

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值