947 移除最多的同行或同列石头

给定二维平面上n个石头的位置,如果某石头的同行或同列有其他石头,可以移除该石头。求能移除的最大石头数量。例如,对于输入[[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]],最大可移除5个石头。" 131099686,7592826,NX二次开发:创建表达式及获取标识tag教程,"['CAD开发', 'NX API', '软件定制', '工程软件', '表达式管理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。
如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。
给你一个长度为 n 的数组 stones ,其中 stones[i] = [xi, yi] 表示第 i 块石头的位置,返回 可以移除的石子 的最大数量。

示例 1:
输入:stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
输出:5
解释:一种移除 5 块石头的方法如下所示:

  1. 移除石头 [2,2] ,因为它和 [2,1] 同行。
  2. 移除石头 [2,1] ,因为它和 [0,1] 同列。
  3. 移除石头 [1,2] ,因为它和 [1,0] 同行。
  4. 移除石头 [1,0] ,因为它和 [0,0] 同列。
  5. 移除石头 [0,1] ,因为它和 [0,0] 同行。
    石头 [0,0] 不能移除,因为它没有与另一块石头同行/列。

示例 2:
输入:stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
输出:3
解释:一种移除 3 块石头的方法如下所示:

  1. 移除石头 [2,2] ,因为它和 [2,0] 同行。
  2. 移除石头 [2,0] ,因为它和 [0,0] 同列。
  3. 移除石头 [0,2] ,因为它和 [0,0] 同行。
    石头 [0,0] 和 [1,1] 不能移除,因为它们没有与另一块石头同行/列。

示例 3:
输入:stones = [[0,0]]
输出:0
解释:[0,0] 是平面上唯一一块石头,所以不可以移除它。

提示:
1 <= stones.length <= 1000
0 <= xi, yi <= 104
不会有两块石头放在同一个坐标点上

方法1:
主要思路:解题汇总链接
(1)按照题目的意思,同一行和同一列上的结点之间存在连接的边,建立邻接表的图,则同一个连通分量中,都可以删除到剩余一个结点,则题目的意思可以转为找图中有多少个连通分量,总的结点数量减去连通分量,就是可以删除的结点数;

class Solution {
public:
    int removeStones(vector<vector<int>>& stones) {
        unordered_map<int,vector<int>> graph;
        vector<vector<int>> edge(stones.size());
        //找出同一个行和列上的结点
        for (int i = 0; i < stones.size(); i++) {
            graph[stones[i][0]].push_back(i);
            graph[stones[i][1] + 10000].push_back(i);
        }
        //建立邻接表的图
        for (auto &it : graph) {
            int k = it.second.size();
            for (int i = 1; i < k; i++) {
                edge[it.second[i - 1]].push_back(it.second[i]);
                edge[it.second[i]].push_back(it.second[i - 1]);
            }
        }
        //标识访问过的结点
        vector<bool> sign(stones.size(),false);
        //统计有多少个连通分量
        int counts=0;
        //使用广度优先搜索找连通分量的数量;
        for(int it=0;it<edge.size();++it){
            if(sign[it]){
                continue;
            }
            sign[it]=true;
            queue<int> q;
            q.push(it);
            ++counts;
            while(!q.empty()){
                int cur_index=q.front();
                q.pop();
                for(int&i:edge[cur_index]){
                    if(sign[i]){
                        continue;
                    }
                    q.push(i);
                    sign[i]=true;
                }
            }
        }
        return stones.size()-counts;//返回可以删除的结点的数量
    }
};
1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值