【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
英文地址,請注明出處:http://en.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;事…