六月集训第六日-滑动窗口

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士

在这里插入图片描述

题目描述:

1984. 学生分数的最小差值 - 力扣(LeetCode)

给你一个 下标从 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;
}
我的思路:

这是一道长度固定好的 滑动窗口的题目,先给数组排好序,然后再去进行滑动窗口,

不要陷入模板的固定套路,看到题目要学会变通(一开始硬套发现是长度固定的赶紧改变思路了)

在这里插入图片描述

题目描述:

1763. 最长的美好子字符串 - 力扣(LeetCode)

我的题解:

错误题解,回头再看了

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;
}

报错原因

在这里插入图片描述

找不出错误原因。。哎太菜了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值