c语言刷题

目录

 1.旋转数组的最小数字旋转数组的最小数字_牛客题霸_牛客网

 题目描述:

题目分析 

代码与运行展示 

2. 错误的集合 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述

题目分析

代码与运行展示


 1.旋转数组的最小数字旋转数组的最小数字_牛客题霸_牛客网

 题目描述:

c语言刷题_第1张图片

题目分析 

题目中所给出的数组是经由非递减数组旋转得来,比如数组{1,2,3,4,5},顺时针旋转1、2得到的数组为:{5,1,2,3,4};{4,5,1,2,3}。逆时针旋转1,2得到的数组为:{2,3,4,5,1};{3,4,5,1,2}。

由此可知,对于非递减数组旋转之后,数组最多只会出现两个数的递减序列,而小的那个数就是数组的最小数;如果数组没有递减数列,则数组的起始元素即为最小数。

代码与运行展示 

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen )
{
    int i=0;
    for(i=1;irotateArray[i])
            return rotateArray[i];//有则返回递减数列中的小值,即右边的值
    }
    return rotateArray[0];//没有递减数列,返回a[0]
}

c语言刷题_第2张图片

2. 错误的集合 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述

c语言刷题_第3张图片

题目分析

题目中的数组非有序,数组元素从1~n,共n个元素。由于数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。返回一个数组ret,ret[0]为重复的数据,ret[1] 为丢失的数据。

我们对题目进行分析,首先我们需要对数组进行排序,然后判断重复的元素与丢失的元素。

重复的元素,已排好序的数组,我们只需要判断 nums[ i ] == nums[ i + 1 ];即可得到nums[ i ]为重复的元素。

难点在于找到丢失的数据。关于这一点我们分为三种情况(我们以排好序的数组作为例题):

丢失的数据为1;

丢失的数据大于1小于n;

丢失的数据为n;

c语言刷题_第4张图片

很明显,第一种情况我们可以让nums[ 0 ] - 0 != 1;

第二种情况, nums[ i+1] - nums[ i ] != 1;

第三种情况,nums[ n-1 ] != n;

我们可以用prev和curr分别记录上一个数据与当前元素数据,省去一些麻烦。

代码与运行展示

int cmp(int* a, int* b) 
{
    return *a - *b;
}
int* findErrorNums(int* nums, int numsSize, int* returnSize) 
{
    int* errorNums = (int*)malloc(sizeof(int) * 2);
    *returnSize = 2;
	qsort(nums, numsSize, sizeof(int), cmp);//对数组进行排序
    int prev = 0;//记录前一个元素的值
    for(int i = 0; i < numsSize; i++) 
	{
        int curr = nums[i];//记录当前元素值
        if (curr == prev) //判断重复的数据
		{
            errorNums[0] = prev;
        }
        else if (curr - prev > 1) //curr减去prev
		{
            errorNums[1] = prev + 1;
        }
        prev = curr;//更新prev值
    }
    if (nums[numsSize - 1] != numsSize) //判断是否是n值被替换
	{
        errorNums[1] = numsSize;
    }
    return errorNums;
}

c语言刷题_第5张图片

你可能感兴趣的:(c语言,算法,数据结构)