右端点对齐|镜像复用

lc1648

lc2271

排序瓷砖区间后用滑动窗口,以每个区间右端点为地毯右端,计算窗口内覆盖的最大长度

class Solution {

typedef long long ll;

public:

int maximumWhiteTiles(vector<vector<int>>& tiles, int carpetLen)

{

ll a = 0, s = 0;

int i = 0, l = carpetLen;

sort(tiles.begin(), tiles.end());

for (auto& v : tiles)

{

int L = v0, R = v1;

s += (ll)(R - L + 1);

++int cl = R - l + 1;++

while (i < tiles.size() && tilesi1 < cl)

{

s -= (ll)(tilesi1 - tilesi0 + 1);

i++;

}

ll u = 0;

if (i < tiles.size() && tilesi0 < cl)

++u = (ll)(cl - tilesi0);++

a = max(a, s - u);

}

return a;

}

};

本质上是窗口内一块一块加毯子,什么情况下缩短窗口呢,毯子盖不到左边毯子的右侧就缩短,开始扯毯子,窗口的大小是多少呢

(我现在已经把整块左侧项的长度都算进来了,而毯子可能只盖到了左侧项的一部分 那么就要减去之前多加进来的长度)

lc3413

镜像翻转 复用代码

先排序硬币区间,用++滑动窗口算正向最大硬币数++

再反转并转换区间方向二次计算,最终取两次结果的最大值。

#include <vector>

#include <algorithm>

using namespace std;

class Solution {

using ll = long long;

ll f(vector<vector<int>>& t, int l) {

ll a = 0, s = 0;

int i = 0;

for (auto& v : t) {

int L = v0, R = v1, c = v2;

s += (ll)(R - L + 1) * c;

int cl = R - l + 1;

while (ti1 < cl) {//find ok_l

s -= (ll)(ti1 - ti0 + 1) * ti2;

i++;

}

ll u = max((ll)(cl - ti0) * ti2, 0LL);

a = max(a, s - u);

}

return a;

}

public:

ll maximumCoins(vector<vector<int>>& c, int k) {

sort(c.begin(), c.end());

ll a = f(c, k);

reverse(c.begin(), c.end());

for (auto& v : c) {

int tmp = v0;

v0 = -v1;

v1 = -tmp;

}

return ++max(a, f(c, k));++

}

};

相关推荐
203号居民3 小时前
LeetCode hot 100 — 25. K 个一组翻转链表
算法·leetcode·链表
ocean21034 小时前
2025-2026年AI算法与模型研发面试高频知识点洞察
人工智能·算法·面试
Nil2084 小时前
leetcode 78子集
数据结构·算法·leetcode
en.en..5 小时前
Linux fork() 工作原理
数据结构·算法
地平线开发者5 小时前
bevformer算法模型详细解读
算法
liliangcsdn6 小时前
ICIR权重矩阵如何加权标准化为综合因子
算法
SDWAN_Cheap6 小时前
SD-WAN智能选路技术的算法与实现机制
算法·php·sdwan
不会就选b7 小时前
数据结构之树&&二叉树(二)
数据结构·算法
渡之7 小时前
ArduPilot (APM)滤波器之SlewLimiter 深度解析
算法
zander2588 小时前
LeetCode 1143. 最长公共子序列
开发语言·python·算法