检查数组是否经过排序和轮转得到的

给你一个数组 nums 。nums 的源数组中,所有元素与 nums 相同,但按非递减顺序排列。

如果 nums 能够由源数组轮转若干位置(包括 0 个位置)得到,则返回 true ;否则,返回 false 。

源数组中可能存在 重复项 。

输入:nums = [3,4,5,1,2]
输出:true
解释:[1,2,3,4,5] 为有序的源数组。
可以轮转 x = 3 个位置,使新数组从值为 3 的元素开始:[3,4,5,1,2] 。

从这里我们可以看出如果我们将原来的两个nums首尾相连,我们能从新得到的数组中得到一个子数组和有序的原数组相同,如3451234512中有12345。所以我们可以创建一个数组是两个nums首尾相连的。然后我们去遍历数组,如果有其有序的原数组,那么我们就可以判断它是排序和转轮得到的。反之则没有。下面是代码,注释放在代码中

int cmpfunc(const void* a, const void* b)

{

    return (*(int*)a - *(int*)b);

}

bool check(int* nums, int numsSize) {

    int* arr1 = (int*)malloc(sizeof(int) * (2 * numsSize));

    int* arr2 = (int*)malloc(sizeof(int) * numsSize);//我们需要一个有序的原数组

    int i = 0;

    for (i = 0; i < numsSize; i++)

    {

        arr1[i] = nums[i];

        arr2[i] = nums[i];

    }

    qsort(arr2, numsSize, sizeof(int), cmpfunc);//让其有序

    for (i; i < 2 * numsSize; i++)

    {

        arr1[i] = nums[i - numsSize];

    }

    int n = 0;

    for (i = 0; i < 2 * numsSize; i++)

    {

        if (arr1[i] == arr2[n])//遇到与有序的原数组的首元素开始往后遍历

        {

            n++;

            if (n == numsSize)//当相等时,说明里面有有序的原数组。

            {

                free(arr1);

                free(arr2);

                arr1 = NULL;

                arr2 = NULL;

                return true;

            }

        }

        else//没有就说明它不是首元素,继续往后遍历,直到找到或者循环结束

        {

            n = 0;

        }

    }

    free(arr1);

    free(arr2);

    arr1 = NULL;

    arr2 = NULL;

    return false;

}

虽然我们可以用哈希表来写,但多一种写法也未尝不可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值