题目列表
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;
}