藍橋每日打卡--打家劫舍4

#藍橋#JAVA#打家劫舍4

題目描述

沿街有一排連續的房屋。每間房屋內都藏有一定的現金。現在有一位小偷計劃從這些房屋中竊取現金。

由于相鄰的房屋裝有相互連通的防盜系統,所以小偷?不會竊取相鄰的房屋?。

小偷的?竊取能力?定義為他在竊取過程中能從單間房屋中竊取的?最大金額?。

給你一個整數數組?nums?表示每間房屋存放的現金金額。形式上,從左起第?i?間房屋中放有?nums[i]?美元。

另給你一個整數?k?,表示竊賊將會竊取的?最少?房屋數。小偷總能竊取至少?k?間房屋。

返回小偷的?最小?竊取能力。

示例 1:

輸入:nums = [2,3,5,9], k = 2
輸出:5
解釋:
小偷竊取至少 2 間房屋,共有 3 種方式:
- 竊取下標 0 和 2 處的房屋,竊取能力為 max(nums[0], nums[2]) = 5 。
- 竊取下標 0 和 3 處的房屋,竊取能力為 max(nums[0], nums[3]) = 9 。
- 竊取下標 1 和 3 處的房屋,竊取能力為 max(nums[1], nums[3]) = 9 。
因此,返回 min(5, 9, 9) = 5 。

解題思路

本題采用二分查找算法來高效地找出滿足條件的最小能力值。二分查找的前提是問題的解空間具有單調性,在本題中,能力值越大,能夠偷取的不相鄰房屋數量就可能越多,因此可以利用二分查找不斷縮小可能的能力值范圍,直到找到最小的滿足條件的能力值。

具體步驟

1. 確定二分查找的左右邊界
  • 左邊界?lower:通過?Arrays.stream(nums).min().getAsInt()?找出數組?nums?中的最小值。這是因為最小的能力值至少要能夠偷取到數組中金額最小的房屋。
  • 右邊界?upper:通過?Arrays.stream(nums).max().getAsInt()?找出數組?nums?中的最大值。這是因為最大的能力值最多為數組中金額最大的房屋的金額。
2. 二分查找過程
  • 使用?while(lower <= upper)?循環進行二分查找,只要左邊界小于等于右邊界,就繼續查找。
  • 在每次循環中,計算當前左右邊界的中間值?middle,作為本次猜測的能力值。
3. 檢查當前能力值是否滿足條件
  • 初始化計數器?count?為 0,用于記錄在當前能力值下可以偷取的不相鄰房屋的數量。
  • 初始化布爾變量?visited?為?false,用于標記上一個房屋是否被偷取。
  • 遍歷數組?nums?中的每個元素?x
    • 如果?x <= middle?且?!visited,說明當前房屋的金額小于等于當前猜測的能力值,并且上一個房屋沒有被偷取,此時可以偷取當前房屋,將?count?加 1,并將?visited?標記為?true
    • 否則,將?visited?標記為?false,表示當前房屋不被偷取。
4. 根據檢查結果調整二分查找的邊界
  • 如果?count >= k,說明在當前能力值下可以偷取到至少?k?個不相鄰的房屋,當前能力值可能過大,將右邊界?upper?更新為?middle - 1,縮小查找范圍。
  • 否則,說明當前能力值過小,將左邊界?lower?更新為?middle + 1,擴大查找范圍。
5. 返回結果
  • 當二分查找結束后,左邊界?lower?即為滿足條件的最小能力值,將其返回。
class Solution {public int minCapability(int[] nums, int k) {int lower = Arrays.stream(nums).min().getAsInt();// 使用 Java 8 的 Stream API 對數組 nums 進行操作// Arrays.stream(nums) 將數組轉換為流// min() 方法找出流中的最小值// getAsInt() 方法將 OptionalInt 類型的結果轉換為 int 類型// 最終將數組中的最小值賦給變量 lower,作為二分查找的左邊界int upper = Arrays.stream(nums).max().getAsInt();// 同樣使用 Stream API// max() 方法找出流中的最大值// getAsInt() 方法將結果轉換為 int 類型// 把數組中的最大值賦給變量 upper,作為二分查找的右邊界while(lower <= upper){// 開始二分查找的循環,只要左邊界小于等于右邊界,就繼續循環int middle = (lower + upper)/2;// 計算當前左右邊界的中間值,作為本次猜測的能力值int count = 0;// 初始化一個計數器 count,用于記錄在當前能力值下可以偷取的房屋數量boolean visited = false;// 初始化一個布爾變量 visited,用于標記上一個房屋是否被偷取for(int x :nums){// 遍歷數組 nums 中的每個元素 xif(x <= middle&&!visited){// 如果當前房屋的金額 x 小于等于當前猜測的能力值 middle,并且上一個房屋沒有被偷取count ++;// 則偷取當前房屋,計數器 count 加 1visited = true;// 標記當前房屋已被偷取}else{visited = false;// 否則,標記當前房屋未被偷取}}if(count >= k){// 如果在當前能力值下可以偷取的房屋數量 count 大于等于要求的數量 kupper = middle -1;// 說明當前能力值可能過大,將右邊界 upper 更新為 middle - 1,縮小查找范圍}else{lower = middle+1;// 否則,說明當前能力值過小,將左邊界 lower 更新為 middle + 1,擴大查找范圍}}return lower;// 當二分查找結束后,左邊界 lower 即為滿足條件的最小能力值,將其返回}
}

同時,利用二分法這里給出了更優的解決方案

class Solution {public int minCapability(int[] nums, int k) {int n = nums.length;int max = 0, min = Integer.MAX_VALUE;// 初始化 max 為 0,用于存儲數組中的最大值// 初始化 min 為 Integer.MAX_VALUE,用于存儲數組中的最小值for(int x:nums){// 遍歷數組 nums 中的每個元素 xif(x < min) min = x;// 如果當前元素 x 小于 min,則更新 min 為 xif(x > max) max = x;// 如果當前元素 x 大于 max,則更新 max 為 x}int left = min, right = max;// 初始化二分查找的左邊界 left 為數組的最小值// 初始化二分查找的右邊界 right 為數組的最大值while(left <= right){// 開始二分查找的循環,只要左邊界小于等于右邊界,就繼續查找int mid = left + right >> 1;// 計算當前左右邊界的中間值 mid,作為本次猜測的能力值// 這里使用位運算 >> 1 代替除以 2,以提高計算效率int count = 0;// 初始化計數器 count,用于記錄在當前能力值下可以偷取的房屋數量for(int i = 0; i < n; ++i){// 遍歷數組 numsif(nums[i] <= mid){// 如果當前房屋的金額 nums[i] 小于等于當前猜測的能力值 midif(++count == k)break;// 先將計數器 count 加 1,若加 1 后 count 等于 k,說明已經找到了 k 個滿足條件的房屋,退出循環++i;// 跳過下一個房屋,確保偷取的房屋不相鄰}}if(count >= k)right = mid - 1;// 如果在當前能力值下可以偷取的房屋數量 count 大于等于 k,說明當前能力值可能過大,將右邊界 right 更新為 mid - 1,縮小查找范圍elseleft = mid + 1;// 否則,說明當前能力值過小,將左邊界 left 更新為 mid + 1,擴大查找范圍}return left;// 當二分查找結束后,左邊界 left 即為滿足條件的最小能力值,將其返回}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74090.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74090.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c#難點整理

1.何為托管代碼&#xff0c;何為非托管代碼 托管代碼就是.net框架下的代碼 非托管代碼&#xff0c;就是非.net框架下的代碼 2.委托的關鍵知識點 將方法作為參數進行傳遞 3.多維數組 4.鋸齒數組 5.多播委托的使用 6.is運算符 相當于邏輯運算符是 7.as 起到轉換的作用 8.可…

Nginx代理本機的443到本機的8080端口

1. 準備工作 確認已生成 IP 的 HTTPS 證書 假設你已通過 mkcert 生成證書&#xff08;如 192.168.199.191.pem 和 192.168.199.191-key.pem&#xff09;&#xff0c;并已安裝 CA 證書&#xff08;運行過 mkcert -install&#xff09;。 Nginx 安裝 ? 若未安裝 Nginx&#…

善用批處理的for命令倍增效率(附彩蛋:windows官方bug)

前言 在我們工作中,如果使用Windows系統,善用批處理命令,特別是在批量的文件處理,文本處理時能幫助我們極大地提升工作效率,起到事半功倍的效果! 但很多同學,對批處理的使用更多還停留在可以將多個command命令組合到一起執行,省去重復敲命令和等待的時間。這個其實只…

數據結構之棧的2種實現方式(順序棧+鏈棧,附帶C語言完整實現源碼)

對于邏輯關系為“一對一”的數據&#xff0c;除了用順序表和鏈表存儲外&#xff0c;還可以用棧結構存儲。 棧是一種“特殊”的線性存儲結構&#xff0c;它的特殊之處體現在以下兩個地方&#xff1a; 1、元素進棧和出棧的操作只能從一端完成&#xff0c;另一端是封閉的&#xf…

Camera2 API拍照失敗問題實錄:從錯誤碼到格式轉換的排坑之旅

一、問題背景 在開發基于Camera2 API的相機應用時&#xff0c;我們遇到了一個棘手的問題&#xff1a;預覽功能在所有設備上工作正常&#xff0c;但在某特定安卓設備上點擊拍照按鈕后無任何響應。值得注意的是&#xff0c;使用舊版Camera API時該設備可以正常拍照。本文記錄了完…

Jmeter舊版本如何下載

1.Jmeter最新版本下載位置 https://jmeter.apache.org/download_jmeter.cgi2.Jmeter舊版本下載位置 https://archive.apache.org/dist/jmeter/binaries穩定版本&#xff1a;5.4.1

css-grid布局

文章目錄 1、布局2、網格軌道3、間距Gap4、網格線5、網格別名 當一個 HTML 元素將 display 屬性設置為 grid 或 inline-grid 后&#xff0c;它就變成了一個網格容器&#xff0c;這個元素的所有直系子元素將成為網格元素。 1、布局 啟用grid布局類似與flex布局&#xff0c;不過g…

SolidWorks使用顯卡教程

操作步驟&#xff1a; 打開注冊表編輯器 按下鍵盤上的 Win R 組合鍵&#xff0c;輸入 regedit 并按回車鍵&#xff0c;打開注冊表編輯器。 導航到顯卡信息路徑 在注冊表中依次展開以下路徑&#xff1a; plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…

【C++11】左值引用、右值引用、移動語義和完美轉發

&#x1f984;個人主頁:修修修也 &#x1f38f;所屬專欄:C ??操作環境:Visual Studio 2022 目錄 &#x1f4cc;左值引用和右值引用 &#x1f38f;左值和左值引用 &#x1f38f;右值和右值引用 &#x1f4cc;左值引用和右值引用比較 &#x1f38f;左值引用 &#x1f38f;右值…

麒麟系列Linux發行版探秘

以下內容摘自《銀河麒麟操作系統進階應用》一書。 銀河麒麟操作系統&#xff08;Kylin&#xff09; 銀河麒麟&#xff08;Kylin&#xff09;操作系統是中國自主研發的一款基于Linux內核的操作系統。它的發展歷程可以追溯到2002年&#xff0c;最初由國防科技大學主導研發&…

【機密計算頂會解讀】11:ACAI——使用 Arm 機密計算架構保護加速器執行

導讀&#xff1a;本文介紹ACAI&#xff0c;其構建一個基于CCA的解決方案&#xff0c;使得機密虛擬機能夠安全地使用加速器&#xff0c;同時保持與現有應用程序的兼容性和安全性&#xff0c;能夠實現對加速器的安全訪問。 原文鏈接&#xff1a;ACAI: Protecting Accelerator Ex…

第一天 UnityShader的結構

Shader初學者的學習筆記 第一天 Unity Shader的結構 文章目錄 Shader初學者的學習筆記前言一、Unity Shader結構二、Unity Shader結構解析① Properties② Tags③ RenderSetup(可選狀態)④ Name⑤ [Tags]⑥ [RenderSetup]⑦ 頂點著色器和片元著色器的代碼 (Unity最聰明的孩子)…

VL開源模型實現文本生成圖片

一、 基礎知識 根據描述生成圖片的視覺-語言模型&#xff08;Vision-Language Models, VL 模型&#xff09;是近年來多模態生成領域的熱點研究方向。這些模型能夠根據自然語言描述生成高質量的圖像&#xff0c;廣泛應用于藝術創作、設計輔助、虛擬場景構建等領域。 1 根據描述…

【Java SE】抽象類/方法、模板設計模式

目錄 1.抽象類/方法 1.1 基本介紹 1.2 語法格式 1.3 使用細節 2. 模板設計模式&#xff08;抽象類使用場景&#xff09; 2.1 基本介紹 2.2 具體例子 1.抽象類/方法 1.1 基本介紹 ① 當父類的某些方法&#xff0c;需要聲明&#xff0c;但是又不確定如何實現時&#xff…

【人工智能】LM Studio 的 GPU 加速:釋放大模型推理潛能的極致優化

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著大語言模型(LLM)的廣泛應用,其推理效率成為限制性能的關鍵瓶頸。LM Studio 作為一個輕量級機器學習框架,通過 GPU 加速顯著提升了大…

深度學習:從零開始的DeepSeek-R1-Distill有監督微調訓練實戰(SFT)

原文鏈接&#xff1a;從零開始的DeepSeek微調訓練實戰&#xff08;SFT&#xff09; 微調參考示例&#xff1a;由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…

流暢如絲:利用requestAnimationFrame優化你的Web動畫體驗

requestAnimationFrame 是前端開發中用于優化動畫性能的 API。它允許瀏覽器在下一次重繪之前執行指定的回調函數&#xff0c;通常用于實現平滑的動畫效果。 1.作用 優化性能&#xff1a;requestAnimationFrame 會根據瀏覽器的刷新率&#xff08;通常是 60Hz&#xff0c;即每秒…

【pytest框架源碼分析五】pytest插件的注冊流程

前文介紹到pytest整體是運用插件來實現其運行流程的。這里仔細介紹下具體過程。 首先進入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…

IoTDB日志提示Too many open files

問題 時序數據庫 IoTDB 1.3.3 版本 IoTDB 執行查詢操作失敗&#xff0c;日志打印提示 Too many open files。通過命令查看打開文件數&#xff0c;結果如下&#xff1a; [root0002 DataReceiver]# lsof|grep 28347|wc -l DataNode 55444 [root0002 DataReceiver]# lsof|g…

prometheus 添加alertmanager添加dingtalk機器人告警

1、dingtalk創建機器人,目前我們采用加白名單的方式校驗 2、定位到如下圖 test結果如下