【leetcode详解】正方形中的最多点数【中等】(C++思路精析)

思路精析:

自定义结构体解读:

一个点是否在题给正方形中,只取决于其横纵坐标的最大值,记为dis

沟通二位数组points和字符串s的桥梁,就是这个点的序号,记为idx

由此自定义结构体,储存dis 和idx

//其中bool operator部分的功能:重载小于操作符“<”, 使sort(vc.begin(), vc.end());按dis值升序排列

struct Node{
	int dis; int idx;
	bool operator<(const Node& other)const
	{
		return dis < other.dis;
	}
};
vector<Node>vc;

集合set的使用解释:

//笔者感觉,对于需要检验重复的问题,这是一种很经典的操作

set<int>st;
if(st.count(s[vc[i].idx]))
{
	if(cur_dis != vc[i].dis) re+=cur;
	return re;
} 
else st.insert(s[vc[i].idx]);

初始化:

int maxPointsInsideSquare(vector<vector<int>>& points, string s) {
    int x, y, sz = points.size();
    Node t_node;
	for(int i=0; i<sz; i++)
    {
    	int dis = max(abs(points[i][0]), abs(points[i][1]));
		t_node.dis = dis;
		t_node.idx = i;
		vc.push_back(t_node);
	}
	sort(vc.begin(), vc.end());
}

补充说明

用re记录总点数,用cur记录当前dis记录的点的个数

只有在dis相同的点全部符合要求时,才将其加到re上

re += cur

int re = 0, cur = 0, cur_dis=-1;
for(int i=0; i<sz; i++)
{
	if(st.count(s[vc[i].idx]))
	{
		if(cur_dis != vc[i].dis) re+=cur;
		return re;
	} 
	else st.insert(s[vc[i].idx]);
	
	if(cur_dis != vc[i].dis){
		re += cur;
		cur = 1;
		cur_dis = vc[i].dis;
	}
	else cur++;
}
return re+cur;

//在上述思路基础上,通过不断调试,见到了更多测试数据,由此进一步完善细节

AC代码见下:

class Solution {
private:
	struct Node{
		int dis; int idx;
		bool operator<(const Node& other)const
		{
			return dis < other.dis;
		}
	};
	vector<Node>vc;
	set<char>st;
public:
    int maxPointsInsideSquare(vector<vector<int>>& points, string s) {
        int x, y, sz = points.size();
        Node t_node;
		for(int i=0; i<sz; i++)
        {
        	int dis = max(abs(points[i][0]), abs(points[i][1]));
			t_node.dis = dis;
			t_node.idx = i;
			vc.push_back(t_node);
		}
		sort(vc.begin(), vc.end());
		int re = 0, cur = 0, cur_dis=-1;
		for(int i=0; i<sz; i++)
		{
			if(st.count(s[vc[i].idx]))
			{
				if(cur_dis != vc[i].dis) re+=cur;
				return re;
			} 
			else st.insert(s[vc[i].idx]);
			
			if(cur_dis != vc[i].dis){
				re += cur;
				cur = 1;
				cur_dis = vc[i].dis;
			}
			else cur++;
		}
		return re+cur;
    }
};

~ 希望对你有启发 ~

  • 18
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值