Leetcode---349周赛

文章介绍了三个编程问题的解决方案。第一题关注在数组中找到既不是最小值也不是最大值的元素。第二题涉及找到并替换字符串中特定子串以获得字典序最小的结果。第三题讨论了如何以最低成本收集巧克力,采用枚举策略求解。
摘要由CSDN通过智能技术生成

题目列表

2733. 既不是最小值也不是最大值

2734. 执行子串操作后的字典序最小字符串

2735. 收集巧克力

2736. 最大和查询(这题难度较大,等以后有时间再和大家分享)

一、2733、既不是最小值也不是最大值

关键是看到题目中说数组中的元素不同,那很显然,1.num数量<=2时,不存在,返回-1,2.在前三个数字中找到中间的那个数返回 

int findNonMinOrMax(int* nums, int numsSize){
    if(numsSize<=2)
        return -1;
    int sum=nums[0]+nums[1]+nums[2];
    int max=fmax(nums[0],fmax(nums[1],nums[2]));
    int min=fmin(nums[0],fmin(nums[1],nums[2]));
    return sum-max-min; 
}

 二、2734. 执行子串操作后的字典序最小字符串

题目要求找到一个子字符串,将该子字符串中的所有字符-1,得到最小的字典序,很显然,前面的字符权重大(因为在比较字符串大小时,优先比较前面字符的大小,不懂的,参照strcmp函数),优先选前面的子字符串,但是a不能进行替换,因为a->z,字典序很显然变大,所以我们要将前面的不含a的第一个尽可能长的子串中的字符-1

需要注意的是:如果字符串全是a组成,根据题要求,我们必须进行一次操作,所以我们选择将最后一个a变成z,理由同上,权重最小,得到的字典序就会相较于其他变形大。s

char * smallestString(char * s){
    int i=0,n=strlen(s);
    while(i<n&&s[i]=='a'){
        i++;
    }
    //考虑到全是a的情况
    if(i==n){
        s[n-1]='z';
        return s;
    }
    while(i<n&&s[i]!='a'){
        s[i]--;
        i++;
    }
    return s;
}

 三、2735. 收集巧克力

 这题的思路其实只要看到这个数据的区间范围都应该想到可以用暴力枚举,当然这个暴力枚举不是就纯暴力,还是要讲究方法的,但大体思路就应该是求出每一次旋转次数得到的最小的成本,然后比较得到最小值返回

我们可以根据它给的例子大致看一下

 

long long minCost(int* nums, int numsSize, int x){
    int n=numsSize;
    long long sum[n];
    //注意数据范围,sum和i都得是long long类型
    for(long long i=0;i<n;i++){
        sum[i]=i*x;
    }
    for(int i=0;i<n;i++){
        int nm=nums[i];
        for(int j=i;j<i+n;j++){
            nm=fmin(nm,nums[j%n]);
            sum[j-i]+=nm;
        }
    }
    long long ans=LLONG_MAX;
    for(int i=0;i<n;i++){
        if(ans>sum[i]){
            ans=sum[i];
        }
    }
    return ans;
}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值