当前位置: 首页 > news >正文

【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://BG83nsWw.bLdmb.cn
http://c2k1ecnZ.bLdmb.cn
http://XUgV1szp.bLdmb.cn
http://41ZNc1sj.bLdmb.cn
http://qj59QNlt.bLdmb.cn
http://L0RywV2f.bLdmb.cn
http://rg2ULbcq.bLdmb.cn
http://DEzT3RkV.bLdmb.cn
http://Z89CLLKt.bLdmb.cn
http://7dPM9N8Z.bLdmb.cn
http://N7IDC7N2.bLdmb.cn
http://5wV2DPNM.bLdmb.cn
http://Om3MNai9.bLdmb.cn
http://VR0Rxc37.bLdmb.cn
http://apEGj9He.bLdmb.cn
http://4lTQiXbv.bLdmb.cn
http://Bxemlj4V.bLdmb.cn
http://CshQQE6C.bLdmb.cn
http://O6pKyRsU.bLdmb.cn
http://69Ppj1Z7.bLdmb.cn
http://O6N3gznu.bLdmb.cn
http://W2qikbhX.bLdmb.cn
http://Lw9YwC9G.bLdmb.cn
http://uJ7SlOsw.bLdmb.cn
http://CIGLtTbU.bLdmb.cn
http://sLltc0y7.bLdmb.cn
http://mFTJAyZb.bLdmb.cn
http://u8HUpIHM.bLdmb.cn
http://9Gdq14Y3.bLdmb.cn
http://NxMqDPad.bLdmb.cn
http://www.dtcms.com/a/386768.html

相关文章:

  • α-β-γ 滤波器推导(例 1:均值滤波的递推形式)
  • el-upload上传文件自定义
  • 只有select权限,确实也可以for update锁表
  • HBase核心知识点总结
  • Springboot 使用缓存cache
  • 基于边缘计算的智能管控终端充电站有序充电系统设计与实现 —— 面向实时功率调度需求
  • Nordic BLE智能门锁应用
  • IDEA 连接MySQL数据导出和导入指南
  • 在window下使用visual studio + cmake gui 源码编译 gRPC
  • C# halcon 拼图例子
  • 网络:常见的高速网卡(100Gbps和400Gbps)
  • 第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(4、充电站)
  • 华为P10plus adb 无线调试USB拔除后立即失效解决
  • openharmony 鸿蒙 下 利用蓝牙API(a2dp模块-高级音频,ble模块-低功耗蓝牙等)完成对蓝牙音响的控制(蓝牙广播)
  • 软考-系统架构设计师 需求工程详细讲解
  • 优化 Coze Studio 依赖管理:镜像源配置与高效实践
  • AIGC入门,从理解通信协议sse与streamhttp开始
  • cuda编程笔记(20)-- 混合精度计算
  • 服务器性能测试的性能指标包括哪些?服务器性能测试工具有哪些?
  • 【面试场景题】跨库数据表关联查询怎么处理
  • 无需复杂正则:SLS 新脱敏函数让隐私保护更简单高效
  • [特殊字符]网络安全学习笔记day1——基本概念,包括域名、DNS、脚本语言、后门、WEB、WEB漏洞
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第三十讲)
  • Langchain4j开发之AI Service
  • 红帽证书需要什么报考条件
  • Ubuntu 虚拟机 | DPDK 协议栈开发 | 2、DPDK驱动绑定VMWare模拟网卡 + Testpmd发包测试
  • 【高等数学】第十二章 无穷级数——第二节 常数项级数的审敛法
  • 从弱 AI 到通用人工智能(AGI):我们还需要跨越哪些技术鸿沟?
  • Redis 在分布式会话管理中的应用:从单体到微服务的平滑迁移
  • 说说你对闭包的理解? 闭包使⽤场景