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

前缀和|并查集

 

lc1722

用并查集 合并可交换下标成连通块

统计各连通块内 source  和 target  元素

计算不匹配元素数量总和,得到最小汉明距离

struct DSU {
DSU(int n) : data(n, -1), cnt(n) {}

    bool unionSet(int x, int y) {
x = root(x);
y = root(y);
if (x == y) return false;
if (data[x] > data[y]) {
swap(x, y);
}
data[x] += data[y];
data[y] = x;
cnt--;
return true;
}

    bool same(int x, int y) {
return root(x) == root(y);
}

    int root(int x) {
return data[x] < 0 ? x : data[x] = root(data[x]);
}

    int size(int x) {
return -data[root(x)];
}

    vector<int> data;
int cnt = 0;
};

 

class Solution {
public:
int minimumHammingDistance(vector<int>& source, vector<int>& target, vector<vector<int>>& allowedSwaps) {
int n = source.size();
DSU dsu(n);
for (auto& swapPair : allowedSwaps) {
dsu.unionSet(swapPair[0], swapPair[1]);
}
unordered_map<int, multiset<int>> s, t;
for (int i = 0; i < n; ++i) {
int root = dsu.root(i);
s[root].insert(source[i]);
t[root].insert(target[i]);
}
int res = 0;
for (int i = 0; i < n; ++i) {
if (s.find(i) == s.end()) continue;
for (int num : s[i])

          {
auto it = t[i].find(num);
if (it == t[i].end()) 
res++;
else 
t[i].erase(it);
}
}
return res;
}
};

 

lc839

模板

struct DSU {
DSU(int n) : data(n, -1), cnt(n) {}

    bool unionSet(int x, int y) {
x = root(x);
y = root(y);
if (x == y) return false;
if (data[x] > data[y]) {
swap(x, y);
}
data[x] += data[y];
data[y] = x;
cnt--;
return true;
}

 

    bool same(int x, int y) {
return root(x) == root(y);
}

    int root(int x) {
return data[x] < 0 ? x : data[x] = root(data[x]);
}

    int size(int x) {
return -data[root(x)];
}

    vector<int> data;
int cnt = 0;
};


解题

class Solution {

public:

    int numSimilarGroups(vector<string>& strs)

{

        DSU dsu(strs.size());

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

            for (int j = i + 1; j < strs.size(); j++) {

                if (dsu.same(i, j)) continue;

                if (!check(strs[i], strs[j])) continue;

                dsu.unionSet(i, j);

            }

        }

        return dsu.cnt;

    }

 

    bool check(string& s1, string& s2)

   {

        int dif = 0;

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

            dif += (s1[i] != s2[i]);

        }

        return (dif == 0 || dif == 2);

    }

};

 

lc1744

 class Solution {
private:
using LL = long long;

public:
vector<bool> canEat(vector<int>& candiesCount, vector<vector<int>>& queries)

{
int n = candiesCount.size();

// 前缀和
vector<LL> sum(n);
sum[0] = candiesCount[0];
for (int i = 1; i < n; ++i) {
sum[i] = sum[i - 1] + candiesCount[i];
}

vector<bool> ans;
for (const auto& q: queries)

{
int favoriteType = q[0], favoriteDay = q[1], dailyCap = q[2];

LL x1 = favoriteDay + 1, y1 = (LL)(favoriteDay + 1) * dailyCap;
LL x2 = (favoriteType == 0 ? 1 : sum[favoriteType - 1] + 1), y2 = sum[favoriteType];

ans.push_back(!(x1 > y2 || y1 < x2));
}
return ans;
}
};

 

lc2055

二分+前缀和

 

预处理每个位置左右最近蜡烛

查询时取有效蜡烛区间

用前缀和快速算出区间内盘子数

 class Solution {

public:

    vector<int> platesBetweenCandles(string s, vector<vector<int>>& qs) {

        vector<int> ans(qs.size(), 0);

        vector<int> sum(s.length() + 1, 0);

        vector<int> list;

 

        for (int i = 0; i < s.length(); i++) {

            if (s[i] == '|') list.push_back(i);

            sum[i + 1] = sum[i] + (s[i] == '*' ? 1 : 0);

        }

 

        if (list.empty()) return ans;

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

            int a = qs[i][0], b = qs[i][1];

            int c = -1, d = -1;

            // 找到 a 右边最近的蜡烛

            int l = 0, r = list.size() - 1;

            while (l < r) {

                int mid = l + r >> 1;

                if (list[mid] >= a) r = mid;

                else l = mid + 1;

            }

            if (list[r] >= a) c = list[r];

            else continue;

 

            // 找到 b 左边最近的蜡烛

            l = 0; r = list.size() - 1;

            while (l < r) {

                int mid = l + r + 1 >> 1;

                if (list[mid] <= b) l = mid;

                else r = mid - 1;

            }

            if (list[r] <= b) d = list[r];

                else continue;

 

          if (c <= d) ans[i] = sum[d + 1] - sum[c];

        }

        return ans;

    }

};

 

http://www.dtcms.com/a/500362.html

相关文章:

  • 如何开网站详细步骤图wordpress高并发
  • 视频网站开发要多少钱手机版的网站怎样做呢
  • 做网站的工作好做吗济南品牌网站建设
  • 最简单的网站开发工具全国建筑信息服务平台
  • 免费cms建站五指哪里有永久免费建站
  • S1-算法效率分析
  • TDengine 数据函数 LN 用户手册
  • 做问卷有哪些网站做360全景有什么网站
  • 东莞网站推广营销网站生成
  • 网站管理助手数据库企业邮箱网页版
  • 算法代码速成8:非线性最小二乘问题编程示例:人口预测
  • 网站建设的目标和需求分析比较好的公关公司
  • 视频播放网站怎么做三亚市住房和城乡建设厅网站
  • 用HarmonyOS中ArkTS的视角来学Dart语法(一)
  • 哪个网站做外贸年费比较便宜wdcp网站无法访问
  • 免费网站建设公司推荐最简单的网站模板下载
  • ConcurrentHashMap 1.7 vs 1.8 源码对决:分段锁 → CAS + synchronized
  • 应急响应—特洛伊挖矿木马事件排查
  • 建个购物网站要多少钱个人网页简历设计
  • 18-自编码器:探讨用于特征学习和数据压缩的神经网络模型
  • 网站结构 seo腾讯短网址在线生成
  • wapi与wifi对比优势总结
  • 上传网站到googleui设计网站建设是什么意思
  • const 与 constexpr
  • 网站的推广运营模板图片可爱
  • 科技软件公司网站模板下载做网站需要前置审批
  • Spring远程命令执行漏洞复现:原理分析+环境搭建+渗透实践(CVE-2018-1270)
  • 杭州城市建设网站wordpress注册白屏
  • python进阶题4
  • 沈阳设计网站公司网站网站建设服务目标