二维差分+前缀和

lc1838

排序+前缀和+滑窗

class Solution {

public:

int maxFrequency(vector<int>& nums, int k) {

int n = nums.size();

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

vector<long long> p(n + 1, 0);

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

pi = pi - 1 + numsi - 1;

}

int ret = 1;

int left = 0;

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

++while ((right - left + 1) * numsright - (pright + 1 - pleft) > k) {++

++left++;++

}

++ret = max(ret, right - left + 1);++

}

return ret;

}

};

lc1894

ll sum不能用reduce会溢出,要手动模拟一下..

class Solution {

/*

输入:chalk = 5,1,5, k = 22

输出:0

*/

public:

int chalkReplacer(vector<int>& chalk, int k)

{

long long sum=0;

for(auto& c:chalk) sum+=c;

if(sum<k)

k%=(int)sum;

int ret=0,n=chalk.size();

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

{

if(k-chalki<0) return i;

else k-=chalki;

}

return 0;

}

};

lc2536

二维差分数组+前缀和

完成多个子矩阵的元素加1操作

++初始化差分数组d,大小为(n+2)×(n+2)(防止越界)++

1-n 通过d cal mat

// 二维前缀和公式

d++ij += di - 1j + dij - 1 - di - 1j - 1;++

++mati - 1j - 1 = dij;++

我们需要对多个子矩阵执行"每个元素加1"的操作,直接遍历每个子矩阵的所有元素会导致时间复杂度过高。++差分数组可以将区间加操作的时间复杂度优化到O(1),之后再通过前缀和计算得到最终矩阵。++

class Solution {

public:

vector<vector<int>> rangeAddQueries(int n, vector<vector<int>>& queries)

{

// ++初始化差分数组d,大小为(n+2)×(n+2)(防止越界)++

vector<vector<int>> d(n + 2, vector<int>(n + 2, 0));

for (auto& q : queries) {

int i1 = q0, j1 = q1, i2 = q2, j2 = q3;

// 差分的区间更新操作

di1 + 1j1 + 1++;

di1 + 1j2 + 2--;

di2 + 2j1 + 1--;

di2 + 2j2 + 2++;

}

// 初始化结果矩阵mat,大小为n×n

vector<vector<int>> mat(n, vector<int>(n, 0));

// 计算二维前缀和,得到最终矩阵

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

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

// 二维前缀和公式

d++ij += di - 1j + dij - 1 - di - 1j - 1;++

++mati - 1j - 1 = dij;++

}

}

return mat;

}

};

说明

  1. 差分数组初始化:创建 (n+2)×(n+2) 的差分数组 d ,防止边界越界。

  2. 差分数组更新:对于每个查询 row1, col1, row2, col2 ,通过++修改差分数组的四个关键点,标记"该区间需要加1"。++

  3. 二维前缀和计算:通过++遍历差分数组并计算二维前缀和,得到每个位置的最终值++,存入结果矩阵 mat 中。

时间复杂度为 O(n² + m) (其中 m 是查询次数),能够高效处理题目中的输入规模~

lc1029

diff sort贪心,先满足a b diff大的取最优

class Solution {

public:

int twoCitySchedCost(vector<vector<int>>& costs)

{

int n=costs.size();

vector<pair<int,int>> diff;

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

{

vector<int> c=costsi;

diff.push_back({abs(c0-c1),i});

}

sort(diff.rbegin(),diff.rend());

int a=n/2,b=n/2,ret=0;

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

{

int idx=diffi.second;

int x=costsidx0,y=costsidx1;

if(!a)

{

ret+=y;b--;

continue;

}

if(!b)

{

ret+=x;a--;

continue;

}

if(x<y)

{

ret+=x;a--;

}

else if(x>y)

{

ret+=y;b--;

}

else

{

if(a>b) a--;

else b--;

ret+=x;

}

}

return ret;

}

};

lc1090

value降序

hash记录labelCountl < useLimit实现限制

class Solution {

public:

int largestValsFromLabels(vector<int>& values, vector<int>& labels, int numWanted, int useLimit)

{

vector<pair<int, int>> valLabel;

int n = values.size();

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

valLabel.emplace_back(valuesi, labelsi);

}

sort(valLabel.rbegin(), valLabel.rend());

unordered_map<int, int> labelCount; // 每个标签已使用的次数

vector<int> selected;

int ret=0,cnt=0;

for (auto& v,l: valLabel) {

if (labelCountl < useLimit && cnt < numWanted) {

ret+=v;

cnt++;

labelCountl++;

}

}

return ret;

}

};

相关推荐
徐小夕8 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao8 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄9 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘569 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
y1su11 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan12 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
其实防守也摸鱼12 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机12 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS10013 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码13 小时前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct