【LeetCode 每日一题】3025. 人员站位的方案数 I——(解法一)暴力枚举

Problem: 3025. 人员站位的方案数 I

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N^3)
    • 空间复杂度:O(1)

整体思路

这段代码旨在解决一个几何计数问题:给定平面上的 n 个点,计算满足特定条件的“点对” (i, j) 的数量。

根据代码的逻辑,一个点对 (i, j) 被认为是一个有效的“对子”,必须满足以下两个条件:

  1. 位置关系:点 i 必须位于点 j左上方区域。代码中的 if ((xa < xb && ya > yb) || (xa < xb && ya == yb) || (ya > yb && xa == xb)) 定义了这个关系,即 xa <= xbya >= yb,并且 (xa, ya) 不能等于 (xb, yb)
  2. “空”矩形条件:由点 i 和点 j 作为对角顶点构成的矩形区域内(包括边界),不能包含任何其他的点 k。这个矩形区域由 xa <= x <= xbyb <= y <= ya 定义。

该算法采用了一种 暴力枚举 (Brute-force Enumeration) 的方法来找到所有满足条件的点对。

其核心逻辑步骤如下:

  1. 外层双重循环:枚举所有可能的点对

    • 代码使用两层嵌套的 for 循环来遍历所有可能的点对 (i, j)
    • if (j == i) 这个判断会跳过一个点与自身构成点对的情况。
    • 这确保了算法会检查 n * (n-1) 个有序点对。
  2. 检查位置关系

    • 对于每一个点对 (i, j),代码首先检查它们是否满足 xa <= xbya >= yb 的位置关系。如果这个基本条件都不满足,那么这个点对肯定不是有效的,直接跳过,继续检查下一个点对。
  3. 内层循环:检查“空”矩形条件

    • 如果位置关系满足,算法就进入了最关键的验证步骤。
    • 它启动了第三层嵌套的 for 循环,遍历所有其他的点 k(即 k != ik != j)。
    • 对于每一个点 k,它会检查其坐标 (xc, yc) 是否落在了由点 i 和点 j 定义的矩形区域内,即 xa <= xc && xc <= xb && ya >= yc && yc >= yb
    • 标志位 valid
      • 在检查开始前,valid 被初始化为 1,假设这个矩形是“空”的。
      • 一旦在矩形内发现任何一个点 k,就说明“空”矩形条件被违反了。此时,立即将 valid 设为 0,并用 break 提前跳出内层循环,因为没有必要再检查其他的点 k 了。
    • 当内层循环结束后,如果 valid 仍然为 1,就说明矩形内确实没有任何其他点。
  4. 累加结果

    • 如果一个点对 (i, j) 同时满足了位置关系和“空”矩形条件(即 valid == 1),那么就将计数器 ans 加一。
  5. 返回结果

    • 在检查完所有可能的点对后,ans 中就存储了最终的总数,将其返回。

完整代码

class Solution {/*** 计算满足特定条件的点对数量。* 条件:点i在点j的左上区域,且以i,j为对角顶点的矩形内没有其他点。* @param points 一个二维数组,每个子数组 [x, y] 代表一个点的坐标。* @return 符合条件的点对的数量。*/public int numberOfPairs(int[][] points) {int n = points.length;int ans = 0;// 步骤 1: 枚举所有可能的点对 (i, j)for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {// 一个点不能与自身配对if (j == i) {continue;}int xa = points[i][0];int ya = points[i][1];int xb = points[j][0];int yb = points[j][1];// 步骤 2: 检查位置关系,点 i 是否在点 j 的左上区域 (xa <= xb, ya >= yb)if (xa <= xb && ya >= yb) {// 假设当前点对是有效的,即矩形是“空”的int valid = 1;// 步骤 3: 检查“空”矩形条件// 遍历所有其他点 kfor (int k = 0; k < n; k++) {// 跳过点 i 和点 j 本身if (k == i || k == j) {continue;}int xc = points[k][0];int yc = points[k][1];// 检查点 k 是否在由 i 和 j 定义的矩形区域内if (xa <= xc && xc <= xb && ya >= yc && yc >= yb) {// 如果找到了一个点在矩形内,则此点对 (i, j) 无效valid = 0;break; // 无需再检查其他点 k,提前退出内层循环}}// 步骤 4: 如果检查完所有点k后,矩形仍然是“空”的,则累加结果ans += valid;}}}return ans;}
}

时空复杂度

时间复杂度:O(N^3)

  1. 外层循环for (int i = 0; i < n; i++) 执行 N 次。
  2. 中层循环for (int j = 0; j < n; j++) 执行 N 次。
    • 这两层循环构成了对所有 N*N 个有序点对的枚举。
  3. 内层循环for (int k = 0; k < n; k++) 执行 N 次。
    • 这个循环用于检查矩形区域。
  4. 综合分析
    • 算法的结构是三层嵌套的循环,每一层的循环次数都与 N 相关。
    • 在最坏的情况下(例如,所有点对都满足位置关系),内层循环几乎总是会被执行。
    • 因此,总的操作次数大致是 N * N * N
    • 所以,该算法的时间复杂度是 O(N^3)

空间复杂度:O(1)

  1. 主要存储开销:算法在执行过程中没有创建任何与输入规模 N 成比例的新的数据结构。
  2. 辅助变量:只使用了 n, ans, i, j, k 和几个用于存储坐标的 int 变量。这些变量的数量是固定的,不随输入 points 数组中点的数量 N 的增加而增加。

综合分析
算法所需的额外辅助空间是常数级别的。因此,其空间复杂度为 O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/923556.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Roo Code 诊断集成功能:智能识别与修复代码问题

这里是引用在日常编程中&#xff0c;遇到代码错误或警告是再常见不过的事。但如何高效定位并解决这些问题&#xff0c;往往考验开发者的经验和工具链的支持。 Roo Code 中有一项非常实用的功能——诊断集成&#xff08;Diagnostics Integration&#xff09;。它能够与 VSCode 的…

Redis 与微服务架构结合:高并发场景下的架构艺术

&#x1f50c; Redis 与微服务架构结合&#xff1a;高并发场景下的架构艺术 文章目录&#x1f50c; Redis 与微服务架构结合&#xff1a;高并发场景下的架构艺术&#x1f9e9; 一、微服务架构下的挑战⚠️ 典型痛点分析&#x1f4ca; 性能瓶颈对比⚙️ 二、Redis作为配置中心&a…

鸿蒙应用冷启动优化:本地 KV 缓存预热实战指南

在鸿蒙&#xff08;HarmonyOS&#xff09;应用开发中&#xff0c;冷启动速度直接影响用户的初始体验。许多应用在启动后需要加载大量常用配置&#xff08;如用户偏好设置、主题配置&#xff09;或基础数据&#xff08;如上次登录信息、常用功能参数&#xff09;&#xff0c;若每…

Java, Rust, C ++开发智能农业APP

# 智能化农业APP开发方案 - Java、Rust、C技术整合我将为您设计一个使用Java、Rust和C开发的智能化农业APP方案&#xff0c;专注于现代农业的数字化转型和智能化升级。## 系统架构设计 --------------------- | 移动客户端 (Android/iOS) | // Java/Kotlin (Android), Swift…

PHP在线客服系统 支持独立部署 双语言切换 离线消息推送

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 该在线客服系统是一款基于&#xff1a;Php MySql Swoole Vue3开发的独立部署的双语在线客服系统。 支持pch5网站、小程序、app各个用户端使用 【为什么要开发这款在线客服系统】 原…

小程序获取视频第一帧

最近我在做一个小程序项目,需要在单个页面里展示大量的视频列表,但有个头疼的限制:小程序官方规定,同一个页面上最多只能放5个 video 组件,超出这个数量,视频就会加载失败,根本无法播放。 这个需求可把我难住了。页面上足足有几十个视频,如果真放几十个 video 标签,不…

MATLAB 常用函数汇总大全和高级应用总结

基础应用 1. 基本数学运算函数函数功能示例abs(x)绝对值abs(-3) → 3sqrt(x)平方根sqrt(16) → 4exp(x)指数函数 exe^xexexp(1) → 2.7183log(x)自然对数log(exp(3)) → 3log10(x)常用对数&#xff08;以 10 为底&#xff09;log10(100) → 2sin(x), cos(x), tan(x)三角函数&am…

vue el-cascader级联选择器-地区三级选择问题记录

1.表单编辑回显问题处理-添加leaf叶子节点<el-form-item label"所在地区" prop"addressCode" required><el-cascader ref"cascader" v-model"form.addressCode" :props"props" change"addressChange" :c…

动态主机配置协议(DHCP)详解

一、 概述DHCP协议Dynamic Host Configuration Protocol &#xff0c;动态主机配置协议作用&#xff1a;动态的进行IP地址分配服务端的监听端口 67/udp客户端监听端口 68/udp网络架构 C/S&#xff1a;client/serverDHCP的优势提高配置效率减少配置错误DHCP的分配方式手动分配&a…

单变量单步时序预测 | TCN-LSTM时间卷积结合长短期记忆神经网络(MATLAB)

✅ 一、主要功能 该代码实现了一个结合时序卷积网络(TCN)和长短期记忆网络(LSTM)的混合深度学习模型,用于时间序列预测。具体任务是:利用前24个时间步的数据(输入特征维度为24),来预测下一个时间步的值(输出维度为1),属于单变量时间序列滚动预测。 ✅ 二、算法步骤…

【智能体】rStar2-Agent

rStar2-Agent 是一篇在大模型推理领域极具洞察力和工程实力的工作&#xff0c;它没有追求参数规模的堆砌&#xff0c;而是通过精巧的算法设计和系统优化&#xff0c;在一个14B的小模型上实现了媲美671B大模型的数学推理能力。 核心思想非常明确&#xff1a;让模型“想得更聪明”…

Coze源码分析-资源库-创建知识库-后端源码-核心技术与总结

11. 核心技术特点 11.1 知识库创建的分层架构设计 清晰的职责分离&#xff1a; API层&#xff08;knowledge_service.go&#xff09;&#xff1a;负责知识库创建请求处理、参数验证、响应格式化应用层&#xff08;knowledge.go&#xff09;&#xff1a;负责知识库创建业务逻辑编…

Nano Banana制作3D立体打印效果图

Nano Banana介绍Nano Banana 是 Google 于 2024 年推出的革命性 AI 驱动图像生成与编辑模型&#xff0c;正式名称为 Gemini 2.5 Flash Image。以下是对它的详细介绍&#xff1a;技术背景&#xff1a;Nano Banana 基于 Google DeepMind 最新的 Gemini 2.5 Flash Image 架构&…

继续吐槽Rstudio

前言 继上次《怪谈级别疑难问题收录》后&#xff0c;怪谈级别的疑难问题又更新了&#xff0c;这次更新了三个让人吐血的奇葩问题&#xff0c;其中就包括大家又爱又恨的Rstudio&#xff0c;一起围观下。 本教程基于Linux环境演示&#xff0c;计算资源不足的同学可参考&#xf…

C++:string模拟实现中的赋值拷贝函数现代写法诡异地崩掉了......

事情是这样的&#xff1a;博主今天回看以前实现过的string&#xff0c;当时就遇到了一个bug:可见博主当时的破防。因为最近在集中复盘C初阶部分&#xff0c;就有点好奇年轻的时候自己写的模拟string是什么样。没想到给我自己留了个bug。现在来细看这个场景&#xff1a;为了测试…

机器学习-Bagging

Bagging-Bootstrap AGGrgratING Bagging并行训练n个基本学习器&#xff08;base learner&#xff09;通过平均所有学习器的输出&#xff08;回归&#xff09;或主投票&#xff08;分类&#xff09;做决策每个模型是用在训练集上通过bootstrap采样得到的新的数据集进行训练得到的…

Unity3D Shader 入门知识

Unity3D Shader 入门知识详解。 Unity3D Shader 入门知识 Shader&#xff08;着色器&#xff09;对很多 Unity 初学者来说像是“黑魔法”。 实际上&#xff0c;Shader 并没有那么神秘&#xff0c;它本质上就是一段运行在 GPU 上的小程序&#xff0c;用来控制 屏幕上每个像素的颜…

【面试之Redis篇】主从复制原理

从面试的角度来解释 Redis 主从复制原理&#xff0c;按照“总-分-总”的结构&#xff0c;清晰地阐述其核心概念、工作流程和关键要点&#xff0c;这能体现出你不仅知道是什么&#xff0c;还理解为什么以及如何应对相关问题。总览&#xff1a;一句话定义 面试官您好&#xff0c;…

数据库开启ssl

数据库&#xff1a;阿里云rds 系统&#xff1a;centos 需要修改的&#xff1a;nacos连接项目连接本地navicat连接 重点&#xff1a;为了兼容本地和服务器&#xff0c;ssl证书路径由原来的绝对路径换成环境变量参数&#xff0c;所以有步骤4 文章目录步骤1 阿里云步骤2 navicat…

Redis 事件驱动与多路复用源码剖析

Redis 事件驱动与多路复用源码剖析1. 前言 Redis 是 单线程 I/O 多路复用 的典型代表。 它并不是多线程处理请求&#xff0c;而是依赖 事件驱动&#xff08;event-driven&#xff09;模型&#xff0c;在一个线程内高效管理海量连接。 核心组件&#xff1a; ae.c&#xff1a;事…