Leetcode每日一题:1782. 统计点对的数目(2023.8.24 C++)

这篇具有很好参考价值的文章主要介绍了Leetcode每日一题:1782. 统计点对的数目(2023.8.24 C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1782. 统计点对的数目

题目描述:

实现代码与解析:

hash + 双指针

原理思路:


1782. 统计点对的数目

题目描述:

        给你一个无向图,无向图由整数 n  ,表示图中节点的数目,和 edges 组成,其中 edges[i] = [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。

第 j 个查询的答案是满足如下条件的点对 (a, b) 的数目:

  • a < b
  • cnt 是与 a 或者 b 相连的边的数目,且 cnt 严格大于 queries[j] 。

请你返回一个数组 answers ,其中 answers.length == queries.length 且 answers[j] 是第 j 个查询的答案。

请注意,图中可能会有 多重边 。

示例 1:

Leetcode每日一题:1782. 统计点对的数目(2023.8.24 C++),LeetCode,leetcode,c++,算法

输入:n = 4, edges = [[1,2],[2,4],[1,3],[2,3],[2,1]], queries = [2,3]
输出:[6,5]
解释:每个点对中,与至少一个点相连的边的数目如上图所示。
answers[0] = 6。所有的点对(a, b)中边数和都大于2,故有6个;
answers[1] = 5。所有的点对(a, b)中除了(3,4)边数等于3,其它点对边数和都大于3,故有5个。

示例 2:

输入:n = 5, edges = [[1,5],[1,5],[3,4],[2,5],[1,3],[5,1],[2,3],[2,5]], queries = [1,2,3,4,5]
输出:[10,10,9,8,6]

提示:

  • 2 <= n <= 2 * 104
  • 1 <= edges.length <= 105
  • 1 <= ui, vi <= n
  • ui != vi
  • 1 <= queries.length <= 20
  • 0 <= queries[j] < edges.length

实现代码与解析:

hash + 双指针

class Solution {
public:
    vector<int> countPairs(int n, vector<vector<int>>& edges, vector<int>& queries) {
        
        vector<int> deg(n); // 每个节点的度 1 ~ n
        unordered_map<int, int> rpt; // 重复计算的边

        // 算度,hash记边
        for (int i = 0; i < edges.size(); i++)
        {
            int a = edges[i][0] - 1, b = edges[i][1] - 1;
            if (a > b) swap(a, b);
            deg[a]++;
            deg[b]++;
            rpt[a << 16 | b]++; // 相当于两个hash,ab边转换,以及对应个数 
        }

        vector<int> arr = deg;
        sort(arr.begin(), arr.end());
        vector<int> res;

        for (int i = 0; i < queries.size(); i++)
        {
            int bound = queries[i];
            int sum = 0;

            // 双指针r找的是第二个数的左边界,因为右边界已经确定是n-1,不用再找了,别搞错了
            for (int l = 0, r = n - 1; l < n; l++ ) 
            {
                while(l < r && arr[l] + arr[r] > bound) r--;
                sum += n - 1 - max(l, r);
            }

            // 去重复
            for (auto &[rp, cnt]: rpt)
            {
                int a = rp >> 16, b = rp & 0xffff;
                if (deg[a] + deg[b] > bound && deg[a] + deg[b] - cnt <= bound) sum--;
            }
            res.push_back(sum);
        }
        return res;
    }
};

原理思路:

        1、存下每个节点的度。

        2、记录每条边,并且记录重边个数。

rpt[a << 16 | b]++;

这种写法,可以将a、b哈希后,记录对应值。

        解析此哈希的方法在去重的代码中,就是逆向思维即可。

        3、将点的度排序。

        4、遍历询问,双指针 l 从最小值开始遍历,r 找出与其和大于等于询问的范围的左边界。差值, n - 1 - max(l, r) 就是符合条件的对数,因为 r 可能小于 l 为了避免重复计算,要取个max,当然,此时还没考虑重边的去除计算。  

        5、遍历边,若在去重前,两边端点节点度和大于目标值,说明已经被sum计算,若去重后,不在符合条件,将sum减一,去掉这种情况。 

        最后返回答案即可。  文章来源地址https://www.toymoban.com/news/detail-683835.html

到了这里,关于Leetcode每日一题:1782. 统计点对的数目(2023.8.24 C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode每日一题:1448. 统计二叉树中好节点的数目

    给你一棵根为  root  的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 示例 1: 示例 2: 示例 3: 提示: 二叉树中节点数目范围是  [1, 10^5]  。 每个节点权值的范围是  [-10^4, 10^4]  。 显然

    2024年02月11日
    浏览(30)
  • 2023-09-02 LeetCode每日一题(最多可以摧毁的敌人城堡数目)

    点击跳转到题目位置 给你一个长度为 n ,下标从 0 开始的整数数组 forts ,表示一些城堡。forts[i] 可以是 -1 ,0 或者 1 ,其中: -1 表示第 i 个位置 没有 城堡。 0 表示第 i 个位置有一个 敌人 的城堡。 1 表示第 i 个位置有一个你控制的城堡。 现在,你需要决定,将你的军队从

    2024年02月10日
    浏览(31)
  • 2023-08-24 LeetCode每日一题(统计参与通信的服务器)

    点击跳转到题目位置 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一台其他服务器进行通信的服

    2024年02月10日
    浏览(31)
  • Leetcode每日一题:1267. 统计参与通信的服务器(2023.8.24 C++)

    目录 1267. 统计参与通信的服务器 题目描述: 实现代码与解析: 写法一:两次遍历 + hash 原理思路: 写法二:三次遍历 原理思路:         这里有一幅服务器分布图,服务器的位置标识在  m * n  的整数矩阵网格  grid  中,1 表示单元格上有服务器,0 表示没有。 如果两

    2024年02月11日
    浏览(27)
  • 2023-06-02 LeetCode每日一题(统计范围内的元音字符串数)

    点击跳转到题目位置 给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。 每个查询 queries[i] = [li, ri] 会要求我们统计在 words 中下标在 li 到 ri 范围内( 包含 这两个值)并且以元音开头和结尾的字符串的数目。 返回一个整数数组,其中数组的第 i 个元素

    2024年02月07日
    浏览(41)
  • 力扣每日一题--2088. 统计农场中肥沃金字塔的数目

    看到这道题有些人很容易放弃,其实这道题不是很难,主要是题目长,读的容易让人放弃,但是 只要抓住一些性质就可以解决该问题。     本题中的定义放到图像里其实就是个金字塔,下层的那部分比上一层的那部分,长度加2, 并且该层那个长度区间内都是1才行。是个金

    2024年01月18日
    浏览(41)
  • 【每日一题】1523. 在区间范围内统计奇数数目,860. 柠檬水找零

    1523. 在区间范围内统计奇数数目 - 力扣(LeetCode) 给你两个非负整数  low  和  high  。请你返回   low   和   high   之间(包括二者)奇数的数目。 示例 1: 示例 2: 提示: 0 = low = high = 10^9          这是一道简单题。读完题目之后,要求奇数个数,最直接简单的想法就是

    2024年02月09日
    浏览(26)
  • LeetCode.每日一题 2427. 公因子的数目

      Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接       我会一直往里填充内容哒! 🌈LeetCode专栏:专栏链接       目前在刷初级算法的LeetBook 。若每日一题当中有力所能

    2023年04月17日
    浏览(23)
  • (位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】

    难度:简单 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。 请你返回排序后的数组。 示例 1: 输入 :arr = [0,1,2,3,4,5,6,7,8] 输出 :[0,1,2,4,8,3,5,6,7] 解释

    2024年02月12日
    浏览(30)
  • 【Py/Java/C++三种语言详解】LeetCode每日一题240117【哈希集合】LeetCode2744、最大字符串匹配数目

    LeetCode2744、最大字符串匹配数目 给你一个下标从 0 开始的数组 words ,数组中包含 互不相同 的字符串。 如果字符串 words[i] 与字符串 words[j] 满足以下条件,我们称它们可以匹配: 字符串 words[i] 等于 words[j] 的反转字符串。 0 = i j words.length 请你返回数组 words 中的 最大 匹配数

    2024年01月18日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包