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

埃氏筛|树dfs|差分计数

 

lc525

把数组里的0换成-1,求子数组和为零的最长长度

 

用哈希表记录前缀和首次出现的位置

通过找相同前缀和的位置差

得出最长的0和1数量相等的子数组长度。

class Solution {
public:
int findMaxLength(vector<int>& nums) {
unordered_map<int,int>hashtable;
int sum=0,ans=0;
hashtable[0]=-1;


for(int i=0; i<nums.size(); i++){
if(nums[i]==0)
nums[i]=-1;
sum+=nums[i];

if(hashtable.find(sum)!=hashtable.end())
ans=max(ans,i-hashtable[sum]);
else
hashtable[sum]=i;    

        }
return ans;
}
};

 

 

lc2779

差分计数

class Solution {
public:
int maximumBeauty(vector<int>& nums, int k) {
int minVal = *min_element(nums.begin(), nums.end());
int maxVal = *max_element(nums.begin(), nums.end());
int offset = minVal - k;


int len = (maxVal + k)+ 2;
vector<int> diff(len, 0);


for (int n : nums) {
int l = max(0, n - k);
int r = n + k + 1; // +1是差分数组的区间结束处理
diff[l]++;
diff[r]--;

}

int ret = 0, cnt = 0;
for (int d : diff) {
cnt += d;
ret = max(ret, cnt);
}

return ret;
}
};

埃氏筛

探索宇宙universe

 

void init = []() {

    np[1] = true;

    for (int i = 2; i * i <= MX; i++) {

        if (!np[i]) {

            for (int j = i * i; j <= MX; j += i) {

                np[j] = true;

            }

        }

    }();

lc2867

埃氏筛 + 图的遍历

 

实现统计满足特定条件(路径关联质数节点)的路径数量:

1. 埃氏筛初始化:

用匿名函数(C++ lambda 结合立即调用  init ),标记  1~1e5  内非质数,为后续判断节点是否为质数做准备。


2. 图处理逻辑:

构建图结构,通过  dfs  遍历图,统计以质数节点为“枢纽”的连通块信息(非质数节点数量),结合数学计算,统计满足路径要求(路径关键节点为质数)的总路径数 

 const int MX = 1e5;

bool np[MX + 1]; // 质数=false 非质数=true

int init = []() {

    np[1] = true;

    for (int i = 2; i * i <= MX; i++) {

        if (!np[i]) {

            for (int j = i * i; j <= MX; j += i) {

                np[j] = true;

            }

        }

    }

    return 0;

}();

 

class Solution {

public:

    long long countPaths(int n, vector<vector<int>> &edges) {

        vector<vector<int>> g(n + 1);

        for (auto &e: edges) {

            int x = e[0], y = e[1];

            g[x].push_back(y);

            g[y].push_back(x);

        }

 

        vector<int> size(n + 1);

        vector<int> nodes;

        function<void(int, int)> dfs = [&](int x, int fa) {

            nodes.push_back(x);

            for (int y: g[x]) {

                if (y != fa && np[y]) {

                    dfs(y, x);

                }

            }

        };

 

        long long ans = 0;

        for (int x = 1; x <= n; x++)

{

            if (np[x]) continue; // 跳过非质数

            int sum = 0;

            for (int y: g[x]) { // 质数 x 把这棵树分成了若干个连通块

                if (!np[y]) continue;

 

                if (size[y] == 0) { // 尚未计算过

                    nodes.clear();

                    dfs(y, -1); // 遍历 y 所在连通块,在不经过质数的前提下,统计有多少个非质数

                    for (int z: nodes) {

                        size[z] = nodes.size();

                    }

                }

 

                // 这 size[y] 个非质数与之前遍历到的 sum 个非质数,两两之间的路径只包含质数 x

                ans += (long long) size[y] * sum;

                sum += size[y];

            }

            ans += sum; // 从 x 出发的路径

        }

        return ans;

    }

};

 

 

lambda函数调用

埃氏筛部分  函数的调用方式

 C++ lambda 函数, ()  是立即调用语法,属于匿名函数的即时执行场景

 

http://www.xdnf.cn/news/18584.html

相关文章:

  • UE5.5 C++ 增强输入 快速上手
  • 恶劣天气下漏检率↓79%!陌讯多模态时序融合算法在道路事故识别的实战优化
  • 淘宝API实战应用:数据驱动商品信息实时监控与增长策略
  • DBeaver连接SQL Server时添加驱动后仍提示找不到驱动的解决方法
  • 51c自动驾驶~合集18
  • 学习记录(二十一)-Overleaf中图片文字间隔太大怎么办
  • java学习 + 一个向前端传流顺序不一致的一个解决思路
  • ubuntu中的nginx.conf和windows中的nginx.conf内容对比
  • 从栈到堆:深入理解C语言静态与动态链表的创建与管理
  • Flutter性能优化完全指南:构建流畅应用的实用策略
  • 如何安全解密受限制的PDF文件
  • [二维前缀和]1277. 统计全为 1 的正方形子矩阵
  • 【线性代数】常见矩阵类型
  • RandAR训练自己的数据集
  • ARINC 825板卡的应用
  • C++---双指针
  • Hyperledger Fabric官方中文教程-改进笔记(十五)-从通道中删除组织
  • Adobe CS6所有系列绿色免安装版,Photoshop 6 Adobe Illustrator CS6 等绿色版
  • 283. 移动零
  • 阿里云拉取dockers镜像
  • Wireshark USRP联合波形捕获(下)
  • 【Linux】Java线上问题,一分钟日志定位
  • 2024年CSP-S认证 CCF信息学奥赛C++ 中小学提高组 第一轮真题讲解 完善程序题解析
  • 面试题及解答:掌握Linux下常用性能分析工具
  • 使用Python实现DLT645-2007智能电表协议
  • 基于php的萌宠社区网站的设计与实现、基于php的宠物社区论坛的设计与实现
  • 【QT入门到晋级】进程间通信(IPC)-共享内存
  • 十六进制与内存地址,数值的差异为1,表示差1个字节,而不是数值差异2^8才表示差一个字节
  • 03-鸿蒙架构与编程模型
  • 《Linux 网络编程二:UDP 与 TCP 的差异、应用及问题应对》