右端点对齐|镜像复用

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

}

};

相关推荐
青山木2 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务2 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
小龙报2 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
txzrxz3 小时前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq3 小时前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode
闪电悠米3 小时前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵
变量未定义~3 小时前
虚拟节点-星石传送阵(4星)、强连通分量
数据结构·算法
IT方大同4 小时前
C语言分支与循环语句
c语言·开发语言·算法
待磨的钝刨4 小时前
深入理解主成分分析(PCA)
人工智能·线性代数·算法·机器学习
wWYy.5 小时前
算法:合并两个有序数组
数据结构·算法