7.17 滑动窗口 |assign |memo |pii bfs |位运算

lcr177.撞色搭配

位运算

class Solution {

public:

vector<int> sockCollocation(vector<int>& sockets)

{

int xorans = 0;

int size = sockets.size();

for(int i = 0 ; i < size; i++){

xorans ^= socketsi;

}

int mask = xorans & (-xorans);

int one = 0,two = 0;

for(int i = 0 ; i < size; i++){

if(socketsi & mask){

one ^= socketsi;

}else{

two ^= socketsi;

}

}

return vector<int>{one,two};

}

};

lc1129.bfs

queue<pii>的抽象

和visnodecolor的check

class Solution {

typedef pair<int, int> pii;

vector<vector<pii>> g;

int n = 0;

public:

vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& redEdges, vector<vector<int>>& blueEdges) {

this->n = n;

g.resize(n);

for (auto& e : redEdges)

ge\[0].push_back({e1, 0});

for (auto& e : blueEdges)

ge\[0].push_back({e1, 1});

vector<int> ans(n, -1);

ans0 = 0;

for (int i = 1; i < n; i++) {

ansi = bfs(0, i);

}

return ans;

}

int bfs(int start, int end) {

queue<pair<int, int>> q;

vector<vector<bool>> vis(n, vector<bool>(2, false));

q.push({start, -1});

int ret = 0;

while (!q.empty()) {

int sz = q.size();

for (int i = 0; i < sz; i++) {

auto curNode, lastC = q.front();

q.pop();

if (curNode == end) {

return ret;

}

for (auto nextNode, edgeC : gcurNode) {

++if ((lastC == -1 || edgeC != lastC) && !visnextNodeedgeC) {++

visnextNodeedgeC = true;

q.push({nextNode, edgeC});

}

}

}

ret++;

}

return -1;

}

};

lc765.

贪心,i+=2的移动

即++遍历2i,check 安排保证2*i+1 换到正确位置++

class Solution {

public:

int minSwapsCouples(vector<int>& row) {

int n = row.size();

unordered_map<int, int> h;

for (int i = 0; i < n; i++)

hrow\[i] = i;

int res = 0;

for (int i = 0; i < n; i += 2) {

int x = rowi;

int p = x % 2 ? x - 1 : x + 1;

if (rowi + 1 != p) {

res++;

int pos = hp;

int t = rowi + 1;

rowi + 1 = p;

rowpos = t;

ht = pos;

hp = i + 1;

}

}

return res;

}

};

lcp56. memo优化tle

或者改用bfs

class Solution {

int m, n;

int dx4 = {0, 0, 1, -1};

int dy4 = {1, -1, 0, 0};

public:

int conveyorBelt(vector<string>& matrix, vector<int>& start, vector<int>& end)

{

int ret = INT_MAX;

m = matrix.size();

n = matrix0.size();

vector<vector<bool>> vis(m, vector<bool>(n, false));

visstart\[0]start\[1] = true;

function<void(int, int, int)> dfs = \&(int a, int b, int cnt)

{

if(cnt>=ret) return;

if (a == end0 && b == end1)

{

ret = min(ret, cnt);

return;

}

for (int k = 0; k < 4; k++)

{

int x = a + dxk, y = b + dyk;

if (x >= 0 && y >= 0 && x < m && y < n && !visxy)

{

int op = cnt;

if (check(k) != matrixab)

op++;

visxy = true;

dfs(x, y, op);

visxy = false;

}

}

};

dfs(start0, start1, 0);

return ret;

}

char check(int k)

{

if (k == 0) return '>';

if (k == 1) return '<';

if (k == 2) return 'v';

return '^';

}

};

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

retminDist - 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++)

{

++fi+1=fi+numsi;++

}

unordered_map<int,int> hash;

++hash0=0;++

for(int i=0;i<=n;i++)

{

int mod=fi%k;

if(hash.count(mod))

{

if(i-hashmod>=2)

return true;

}

else

hashmod=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+carde,cnt+1);

dfs(b+1,e,sum+cardb,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+=cardPointsr;

r++;

if(r-l==w)

{

ret=min(ret,sum);

sum-=cardPointsl;

l++;

}

}

int ans=tt-ret;

if(ret==INT_MAX) ans=tt;

return ans;

}

};

相关推荐
土司大王15 分钟前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹32 分钟前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
土司大王38 分钟前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
罗西的思考2 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
无小道3 小时前
C++——列表初始化
c++·列表初始化
小哈里3 小时前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
blueSatchel3 小时前
c++action 编写(ros-humble)
c++·ros2
小π军4 小时前
最大重叠区间数量
数据结构·算法
镜像视界(浙江)科技有限公司4 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
a187927218315 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解