蓝桥杯程序设计备赛(2024.1.14)

33. 搜索旋转排序数组icon-default.png?t=N7T8https://leetcode.cn/problems/search-in-rotated-sorted-array/

        这个题目的描述很长,请耐心读完。你会发现中间那一大段对解题好像没有什么用。这个题目化简起来就是给你一个nums数组,然后需要你去找一下这个nums数组里面有没有target这个数字,如果有就返回target在nums里面的下标,如果没有就返回-1。

        读完题目就有思路了,超级快。对nums这个数组进行遍历,比较每个元素跟target的大小,如果一样就return下标,如果没有一样的,那就return-1。

        提醒一下哦,下标是从0开始的。题目的这个nums数组的长度为numsSize,那么nums这个数组的下表就是从0到numsSize-1。

int search(int* nums, int numsSize, int target) {
    for(int i =0;i<numsSize;i++){
        if(nums[i] == target)return i;
    }    
    return -1;
}

81. 搜索旋转排序数组 IIicon-default.png?t=N7T8https://leetcode.cn/problems/search-in-rotated-sorted-array-ii/        这题跟上面那题很像,先自己写写看,看一下你能不能理解这种题目的解题方法。

153. 寻找旋转排序数组中的最小值icon-default.png?t=N7T8https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/

        这题也有两种方法能解。

        一、挨个遍历找出最小值

        第1个跟第二2个比,如果第1个小,那么就拿第1个跟第3个比,如果第3个小,就拿第3跟跟第4个比。这个思路的还是需要我们来遍历数组。

int findMin(int* nums, int numsSize) {
    int min = nums[0];
    for(int i = 1;i<numsSize;i++){
        if(min>nums[i])min = nums[i];
    }
    return min;
}

          二、排个顺序

        题目中说了,数组nums里面的元素值互不相同,所以说我们可以给他来个升序排列。这个具体怎么排列的后面到排列的时候再说,我先把代码给出来。升序排列之后的最小值就是数组里面的第一个数。

int cmp(const void*a,const void*b){
    int val1 = *(int*) a;
    int val2 = *(int*) b;
    return val1>val2?1:-1;
}

int findMin(int* nums, int numsSize) {
    qsort(nums,numsSize,sizeof(int),cmp);
    return nums[0];
    }

509. 斐波那契数icon-default.png?t=N7T8https://leetcode.cn/problems/fibonacci-number/

        这个的话,还是遍历。涉及到递归,可以自行了解。

        我们要先申请一个足够大的数组,因为n的最大值是30,也就是下标的最大值是30.所以需要申请31个。然后再给下标是0和1的赋值,最后按照计算规则进行遍历计算。

int fib(int n){
    int f[31];
    f[0] = 0;
    f[1] = 1;
    for(int i = 2;i<=n;i++){
        f[i] = f[i-1] + f[i-2];
    }
    return f[n];
}

70. 爬楼梯icon-default.png?t=N7T8https://leetcode.cn/problems/climbing-stairs/        这题也是斐波那契数列。

int climbStairs(int n) {
    int f[46];
    f[1] = 1;
    f[2] = 2;
    for(int i = 3;i<=n;i++){
        f[i] = f[i-1] + f[i-2];
    }
    return f[n];
}
1137. 第 N 个泰波那契数icon-default.png?t=N7T8https://leetcode.cn/problems/n-th-tribonacci-number/
int tribonacci(int n){
    int f[38];
    f[0] = 0;
    f[1] = f[2] = 1;
    for(int i = 3;i<=n;i++){
        f[i] = f[i-1]+f[i-2]+f[i-3];
    }
    return f[n];
}

2006. 差的绝对值为 K 的数对数目icon-default.png?t=N7T8https://leetcode.cn/problems/count-number-of-pairs-with-absolute-difference-k/

第一个数字跟第一个数字后面的数字去做差,然后对差利用abs函数来绝对值,再去判断跟k是不是一样的,一样的就cnt加1,cnt代表满足题目意思的对数。

int countKDifference(int* nums, int numsSize, int k) {
    int cnt = 0;
    for(int i = 0;i<numsSize;i++){
        for(int j = i+1;j<numsSize;j++){
            if(abs(nums[j]-nums[i]) == k){
                cnt++;
            }
        }
    }
    return cnt;
}

LCP 01. 猜数字icon-default.png?t=N7T8https://leetcode.cn/problems/guess-numbers/

这个题目需要我们输出两个数组相同下表下的数字有多少个数字是一样的,还需要一个计数器。

int game(int* guess, int guessSize, int* answer, int answerSize){
    int cnt= 0;
    for(int i = 0 ;i<guessSize;i++){
       if(guess[i] == answer[i]) cnt++;
    }
    return cnt;
}

LCP 06. 拿硬币icon-default.png?t=N7T8https://leetcode.cn/problems/na-ying-bi/

        这个题目怎么分析?首先思考,假如有一堆硬币,硬币的数量是n,我最少需要拿多少次才能拿完。如果n是偶数,那就是n/2,如果是奇数呢?那就是(n+1)/2。在这个逻辑的基础上,我们只需要知道n是多少就行了。当然还是需要一个计数器。

int minCount(int* coins, int coinsSize){
    int sum = 0;
    for(int i = 0;i<coinsSize;i++){
        sum += coins[i]%2==0?coins[i]/2:(coins[i]+1)/2;
    }
    return sum;
}

LCR 069. 山脉数组的峰顶索引icon-default.png?t=N7T8https://leetcode.cn/problems/B1IidL/

这个题的题目我没有截取完整,题目下面的提示说了保证arr是一个山脉数组。所以我们只需要在对数组相邻的两个数字进行比大小,如果下标n比下标是n+1的小,并且n+1的比n+2的大,那么n+1就是山顶的下标。

int peakIndexInMountainArray(int* arr, int arrSize){
    int n = arr[0];
    int j;
    for(int i = 1; i<arrSize ; i++){
        if(n<arr[i]) {
            n=arr[i];
            j = i;
            if (n>arr[i+1]) break;
        }
    }
    return j;
}

  • 38
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他乡明月.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值