当前位置: 首页 > news >正文

7.17 滑动窗口 | assign

 

 

lc3015.

法1:暴力bfs,数据范围only 100,可以过

 

法2:加入了x,y,可以思考加入的x,y影响了什么呢? 通过数学找规律

class Solution {
public:
vector<int> countOfPairs(int n, int x, int y) {
vector<int> ret(n, 0);
for (int i = 1; i <= n; ++i) {
for (int j = i + 1; j <= n; ++j) {
// 计算三种可能路径的最短距离
int direct = j - i; 
  int viaX = abs(i - x) + 1 + abs(j - y); 
int viaY = abs(i - y) + 1 + abs(j - x); 

int minDist = min({direct, viaX, viaY});
ret[minDist - 1] += 2;
}
}
return ret;
}
};

 

assign

assign  是容器(比如 vector)的一个接口

作用:清空容器原来的内容,然后放入新的元素。

打个比方,就像你有一个盒子, assign(n, false)  就相当于:

  • - 先把盒子里原来的东西全倒掉
  • - 再往盒子里放  n  个  false 

这样能确保容器里的内容是全新的,不会有之前残留的数据,避免出错。

 

lc523.同余定理

两个注意点

  • 同余定理:余数相同的两个数,做差可被整除。--前缀和
  • hash存mod,不可以用set,因为要保证len大于等于2,所以要存idx映射

!!还有对于全选和全不选的两个边界,下标初始化处理

同余定理就是说:两个整数 a 和 b,如果除以同一个正整数 m 后余数相同,就称 a 和 b 对 m 同余,简单记成  a ≡ b (mod m)  ,大白话就是“除以 m 剩得一样” 。

比如 17 和 5 除以 6 都余 5,就说 17 和 5 对 6 同余 。则(17-5)%6=0,余数相同的两个数,做差可被整除。

class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) 
{
int n=nums.size();
vector<int> f(n+1,0);

for(int i=0;i<n;i++)
{
f[i+1]=f[i]+nums[i];
}
unordered_map<int,int> hash;
hash[0]=0;

for(int i=0;i<=n;i++)
{
int mod=f[i]%k;

if(hash.count(mod))
{
if(i-hash[mod]>=2)
return true;
}
else
hash[mod]=i;
}
return false;

}
};

 

lc1423.

滑动窗口➕正难则反(用滑动窗口,就要转化为连续部分才能滑~)

 

取两边最大->转化为中间最小

喜提tle....

class Solution {
vector<int> card;
int n=0,k=0,ret=0;
public:
int maxScore(vector<int>& cardPoints, int k) 
{
card=cardPoints;
this->k=k;
n=cardPoints.size();
dfs(0,n-1,0,0);

return ret;
}

void dfs(int b,int e,int sum,int cnt)
{
if(cnt==k) 

ret=max(ret,sum);
return;
}

dfs(b,e-1,sum+card[e],cnt+1);
dfs(b+1,e,sum+card[b],cnt+1);
}
};

滑动窗口,正难则反

class Solution {

public:

    int maxScore(vector<int>& cardPoints, int k) {

        int ret=INT_MAX,sum=0;

        int l=0,r=0;

        int n=cardPoints.size();

        int w=n-k;

        int tt=0;

        

        for(auto& c:cardPoints)

            tt+=c;

        

        while(r<n)

        {

            sum+=cardPoints[r];

            r++;

            

            if(r-l==w)

            {

                ret=min(ret,sum);

                sum-=cardPoints[l];

                l++;

            }

        }

        int ans=tt-ret;

        if(ret==INT_MAX) ans=tt;

        return ans;

    }

};

 

http://www.dtcms.com/a/283219.html

相关文章:

  • Docker容器访问挂载文件权限问题
  • MPPT电路设计
  • vue中后端返回数据流,前端实现导出下载
  • 等价关系与不变量
  • Web3:Solidity入门到精通
  • cdr序列化与反序列化
  • SenseGlove力反馈手套:医疗、生产制造、军事模拟与远程机器人控制新革命
  • 【AI交叉】化学:人工智能如何重塑现代化学研究?
  • 谷歌引入开源全栈 AI 代理栈:借助 Gemini 2.5 和 LangGraph 实现多步网络搜索、反思与综合
  • NMS代码详解(数据维度变换解析)
  • 格密码--Ring-SIS和Ring-LWE
  • 架构解密|一步步打造高可用的 JOCR OCR 识别服务
  • oracle会话控制和存储状态查询
  • pyqt当中splitter.setSizes()不生效
  • C++中vector和list的优缺点对比以及deque
  • PowerJob集群机器数为0问题
  • Python第八章作业(初级)
  • 如何使用VScode使用ssh连接远程服务器不需要输入密码直接登录
  • 27.Hamming 距离
  • transformers基础Data Collator
  • 教程:如何快速查询 A 股实时 K线和5档盘口
  • 今日行情明日机会——20250716
  • Redis深度解析:从缓存到分布式系统的核心引擎
  • 用python实现自动化布尔盲注
  • pytest--1--pytest-mock常用的方法
  • 代码随想录day36dp4
  • 震坤行获取商品SKU操作详解
  • 16路串口光纤通信FPGA项目实现指南
  • Kotlin获取集合中的元素操作
  • Java与Vue精心打造资产设备管理系统,提供源码,适配移动端与后台管理,助力企业高效掌控资产动态,提升管理效能