2022.6.6
模板:
滑动窗口
由于不是很擅长,先准备一下参考一下b站红桃A士的模板进行参考学习
//最长模板:
初始化left,right,result,bestResult
while(右指针没有到结尾){
窗口扩大,加入right对应元素,更新当前result
while(result不满足要求){
窗口缩小,移除left对应元素,left右移
}
更新最优解bestResult;
right++
}
返回bestResult;
//最短模板
初始化left,right,result,bestResult
while(右指针没有到结尾){
窗口扩大,加入right对应元素,更新当前result
while(result满足要求){
更新最优结果bestResult
窗口缩小,移除left对应元素,left右移
}
right++;
}
返回bestResult;
模板思路:参考红桃A士
题目描述:
给你一个 下标从 0 开始 的整数数组
nums
,其中nums[i]
表示第i
名学生的分数。另给你一个整数k
从数组中选出任意
k
名学生的分数,使这k
个分数间 最高分 和 最低分 的 差值 达到 最小化 。返回可能的 最小差值 。
我的题解:
//排序+滑动窗口
int cmp(void* a,void* b){
return *(int*)a-*(int*)b;//递增
}
int minimumDifference(int* nums, int numsSize, int k){
//遇事不决先排序
qsort(nums,numsSize,sizeof(int),cmp);
int left=0,right=k-1;
int result=nums[right]-nums[left],bestResult=INT_MAX;
while(right<numsSize){//边界条件
result=nums[right]-nums[left];
if(result<bestResult){
bestResult=result;
}
left++;
right++;
}
return k==1?0:bestResult;
}
我的思路:
这是一道长度固定好的
滑动窗口
的题目,先给数组排好序,然后再去进行滑动窗口,不要陷入模板的固定套路,看到题目要学会变通(一开始硬套发现是长度固定的赶紧改变思路了)
题目描述:
我的题解:
错误题解,回头再看了
int Code(char a){
//转成统一形势
int tmp=0;
if(a>='a'&&a<='z'){
tmp=a-'a';
}else{
//为大写的
tmp=a-'A'+26;//和小写做区分
}
return tmp;
}
char * longestNiceSubstring(char * s){
int len=strlen(s);
//创建哈希数组
int* hash=(int*)malloc(sizeof(int)*53);
memset(hash,0,sizeof(hash));
int l,i,j,maxlen=0,k,finalj,finali;
//枚举所有可能的长度l
for(l=len;l>0;l--){
i=0;
j=-1;
while(j<len-1){
++j;
hash[Code(s[j])]++;//放入j
while(j-i+1>l){
//之间相差距离小于len的时候
//要让i往左移缩小距离
hash[Code(s[i])]--;
++i;
}
//这样就可以使得数组不停缩小以枚举出所有可能的长度
if(j-i+1==l){
for(k=0;k<26;++k){
if(hash[k]&&!hash[k+26]){
//也就是说当一个为1而相差26的大写字母为0说明有一个不存在
break;
}
if(!hash[k]&&hash[k+26]){
break;
}
}
}
if(k==26){
//也就说满足最长美好字符串
if(len>maxlen){
maxlen=len;//len=j-i+1
finali=i;
finalj=j;
}
}
}
}
int afterlen=finalj-finali+1;
char* ret=(char*)malloc(sizeof(char)*(afterlen+1));
strncpy(ret,s+finali,afterlen);
ret[afterlen]='\0';
return ret;
}
报错原因
找不出错误原因。。哎太菜了