2023-08-23力扣每日一题

链接:

1782. 统计点对的数目

题意:

给n个点和m条无向边(可重复),q个查询

定义edge[a]为一个点是a的边数量,定义ret[a,b]edge[a]+edge[b]-(a与b的边)

q个查询q个答案,第i次查询值val[i],求所有的1<=a<b<=n条件下有多少ret[a,b]>val[i]

解:

TLE卡47了

看了评论区用空间换时间,双指针

实际代码:

c++ 复制代码
class Solution {
public:
    typedef pair<int,int> pii;
vector<int> countPairs(int n, vector<vector<int>>& edges, vector<int>& queries)
{
	vector<int>edgeNum(n+1);//记录edge[a]
	map<pii,int>edgePair;
	for(auto edge:edges)
	{
		if(edge[0]>edge[1]) swap(edge[0],edge[1]);
		edgeNum[edge[0]]++;
		edgeNum[edge[1]]++;
		edgePair[{edge[0],edge[1]}]++;//记录(a与b的边)
	}
	vector<int>ans;	
	vector<int>edgeNS(edgeNum);	
	sort(edgeNS.begin(),edgeNS.end());//空间换时间 排序
	
	for(auto querie:queries)
	{
		int temp=0;
		int left=1,right=n;
		while(left<right)//双指针 
		{
			if(edgeNS[left] + edgeNS[right] <= querie) left++;
			else
			{
				temp+= right-left;
				right--;
			}
		}
		for(auto Pair:edgePair)
		{
			int s=edgeNum[Pair.first.first]+edgeNum[Pair.first.second];
			if(s>querie && s-Pair.second<=querie) temp--;
		}
		ans.push_back(temp);
	}
	return ans;
}
};

限制:

  • 2 <= n <= 2 * 104
  • 1 <= edges.length <= 105
  • 1 <= ui, vi <= n
  • ui != vi
  • 1 <= queries.length <= 20
  • 0 <= queries[j] < edges.length
相关推荐
CoderYanger4 小时前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
cooldream20096 小时前
当代 C++ 的三大技术支柱:资源管理、泛型编程与模块化体系的成熟演进
开发语言·c++
Queenie_Charlie6 小时前
数字去重(set)
数据结构·c++·set
圣保罗的大教堂6 小时前
leetcode 3433. 统计用户被提及情况 中等
leetcode
Ayanami_Reii7 小时前
区间不同数的个数-树状数组/线段树/莫队/主席树
数据结构·c++·算法·线段树·树状数组·主席树·莫队
大筒木老辈子7 小时前
C++笔记---并发支持库(atomic)
java·c++·笔记
zero_hz7 小时前
核心区分:用户态/内核态切换 vs. 程序阻塞
c++·io·内核态用户态
胡萝卜3.07 小时前
深入C++可调用对象:从function包装到bind参数适配的技术实现
开发语言·c++·人工智能·机器学习·bind·function·包装器
CoderYanger7 小时前
C.滑动窗口-求子数组个数-越长越合法——3325. 字符至少出现 K 次的子字符串 I
c语言·数据结构·算法·leetcode·职场和发展·哈希算法·散列表
看见繁华7 小时前
C++ 高级
开发语言·c++