【Leetcode】2106. 摘水果

文章目錄

  • 題目
  • 思路
  • 代碼
    • C++
    • Java
    • Python
  • 復雜度分析
    • 時間復雜度
    • 空間復雜度
  • 結果
  • 總結

題目

題目鏈接🔗

在一個無限的 x 坐標軸上,有許多水果分布在其中某些位置。給你一個二維整數數組 fruits ,其中 fruits[i] = [positioni, amounti] 表示共有 amounti 個水果放置在 positioni 上。fruits 已經按 positioni 升序排列 ,每個 positioni 互不相同 。

另給你兩個整數 startPos 和 k 。最初,你位于 startPos 。從任何位置,你可以選擇 向左或者向右 走。在 x 軸上每移動 一個單位 ,就記作 一步 。你總共可以走 最多 k 步。你每達到一個位置,都會摘掉全部的水果,水果也將從該位置消失(不會再生)。

返回你可以摘到水果的 最大總數 。

示例 1:
在這里插入圖片描述

輸入:fruits = [[2,8],[6,3],[8,6]], startPos = 5, k = 4
輸出:9
解釋:
最佳路線為:

  • 向右移動到位置 6 ,摘到 3 個水果
  • 向右移動到位置 8 ,摘到 6 個水果
    移動 3 步,共摘到 3 + 6 = 9 個水果

示例 2:
在這里插入圖片描述

輸入:fruits = [[0,9],[4,1],[5,7],[6,2],[7,4],[10,9]], startPos = 5, k = 4
輸出:14
解釋:
可以移動最多 k = 4 步,所以無法到達位置 0 和位置 10 。
最佳路線為:

  • 在初始位置 5 ,摘到 7 個水果
  • 向左移動到位置 4 ,摘到 1 個水果
  • 向右移動到位置 6 ,摘到 2 個水果
  • 向右移動到位置 7 ,摘到 4 個水果
    移動 1 + 3 = 4 步,共摘到 7 + 1 + 2 + 4 = 14 個水果

示例 3:
在這里插入圖片描述

輸入:fruits = [[0,3],[6,4],[8,5]], startPos = 3, k = 2
輸出:0
解釋:
最多可以移動 k = 2 步,無法到達任一有水果的地方

提示:

1 <= fruits.length <= 105
fruits[i].length == 2
0 <= startPos, positioni <= 2 * 105
對于任意 i > 0 ,positioni-1 < positioni 均成立(下標從 0 開始計數)
1 <= amounti <= 104
0 <= k <= 2 * 105

思路

本題的核心是求解從起始位置startPos出發,最多走k步所能摘到的最大水果數量。考慮到路徑可能涉及向左或向右先走然后折返,我們可以枚舉可能的右側最遠位置R(從startPos到startPos + k的范圍),計算對應步數sr = R - startPos,然后計算在剩余步數下能到達的最左側距離dd。dd通過兩種策略計算:先向左走然后向右到R(dd <= (k - sr)/2),或先向右到R然后向左(dd <= k - 2*sr),取兩種策略的最大dd,并clamp到[0, startPos]。使用數組arr存儲每個位置的水果數量,left數組預計算從startPos向左的累加和。最后,對于每個R,計算從startPos - dd到R的水果總量,取最大值。這種方法高效地覆蓋了所有可能路徑,并確保在O(N)時間內求解,其中N = max(startPos, 最大位置) <= 4e5。

代碼

C++

class Solution {
public:int maxTotalFruits(vector<vector<int>>& fruits, int startPos, int k) {int n = max(startPos, fruits.back()[0]);vector<int> arr(n + 1, 0);for(auto& x : fruits) arr[x[0]] += x[1];vector<int> left(n + 1, 0);// 向左走 startPos - i 步int last = 0;for(int i = startPos; i >= 0; i --) {left[startPos - i] = last + arr[i];last = left[startPos - i];}int x = 0, res = 0;for(int i = startPos; i <= min(startPos + k, n); i ++) {if(i != startPos) x += arr[i];int sr = i - startPos; // 向右走了 sr 步// 最多向左走了幾步// l -> r// (k-sr)/2// r -> l// k - 2 * srres = max(res, x + left[min(startPos, max((k-sr)/2, k-2*sr))]);}return res;}
};

Java

class Solution {public int maxTotalFruits(int[][] fruits, int startPos, int k) {int n = Math.max(startPos, fruits[fruits.length - 1][0]);int[] arr = new int[n + 1];for (int[] x : fruits) {arr[x[0]] += x[1];}int[] left = new int[n + 1];int last = 0;for (int i = startPos; i >= 0; i--) {left[startPos - i] = last + arr[i];last = left[startPos - i];}int x = 0;int res = 0;int maxI = Math.min(startPos + k, n);for (int i = startPos; i <= maxI; i++) {if (i != startPos) {x += arr[i];}int sr = i - startPos;int cand1 = (k - sr) / 2;int cand2 = k - 2 * sr;int dd = Math.max(cand1, cand2);dd = Math.min(startPos, Math.max(0, dd));res = Math.max(res, x + left[dd]);}return res;}
}

Python

class Solution:def maxTotalFruits(self, fruits: List[List[int]], startPos: int, k: int) -> int:n = max(startPos, fruits[-1][0])arr = [0] * (n + 1)for p, a in fruits:arr[p] += aleft = [0] * (n + 1)last = 0for i in range(startPos, -1, -1):left[startPos - i] = last + arr[i]last = left[startPos - i]x = 0res = 0max_i = min(startPos + k, n)for i in range(startPos, max_i + 1):if i != startPos:x += arr[i]sr = i - startPoscand1 = (k - sr) // 2cand2 = k - 2 * srdd = max(cand1, cand2)dd = min(startPos, max(0, dd))res = max(res, x + left[dd])return res

復雜度分析

時間復雜度

O(N),其中N = max(startPos, 最大位置) <= 4 \times 10^5,預計算left數組和循環枚舉右側位置均為O(N)。

空間復雜度

O(N),用于存儲arr和left數組。

結果

該解法通過了LeetCode的所有測試用例,運行時間和內存消耗均在可接受范圍內。

總結

通過枚舉右側最遠位置并計算最大左側延伸距離,該方法巧妙地處理了路徑折返的兩種策略,確保了正確性和高效性。如果位置范圍較大,可考慮使用前綴和優化進一步壓縮空間,但當前實現已足夠優秀。https://leetcode.cn/problems/maximum-fruits-harvested-after-at-most-k-steps/description/?envType=daily-question&envId=2025-08-03

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

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

相關文章

(CVPR 2024)SLAM卷不動了,機器人還有哪些方向能做?

關注gongzhonghao【CVPR頂會精選】眾所周知&#xff0c;機器人因復雜環境適應性差、硬件部署成本高&#xff0c;對高效泛化一直需求迫切。再加上多傳感器協同難題、真實場景數據獲取不易&#xff0c;當下對遷移學習 機器人智能融合的研究也就更熱烈了。不過顯然&#xff0c;這…

Go語言 延 遲 語 句

延遲語句&#xff08;defer&#xff09;是Go 語言里一個非常有用的關鍵字&#xff0c;它能把資源的釋放語句與申請語句放到距離相近的位置&#xff0c;從而減少了資源泄漏的情況發生。延遲語句是什么defer 是Go 語言提供的一種用于注冊延遲調用的機制&#xff1a;讓函數或語句可…

【go 】數組的多種初始化方式與操作

在 Go 語言中&#xff0c;數組是一種固定長度的數據結構&#xff0c;用于存儲相同類型的元素。以下是 Go 中數組的多種初始化方式&#xff0c;結合搜索結果整理如下&#xff1a; &#xff08;一&#xff09;使用 var 關鍵字聲明并初始化數組 使用 var 關鍵字聲明數組時&#xf…

基于Java+MySQL 實現(Web)網上商城

悅桔拉拉商城1. 課設目的可以鞏固自己之前所學的知識&#xff0c;以及學習更多的新知識。可以掌握業務流程&#xff0c;學習工作的流程。2. 開發環境硬件環境&#xff1a;Window11 電腦、Centos7.6 服務器軟件環境&#xff1a;IntelliJ IDEA 2021.1.3 開發工具JDK 16 運行環境M…

高并發搶單系統核心實現詳解:Redisson分布式鎖實戰

一、方法整體流程解析 #mermaid-svg-MROZ2xF7WaNPaztA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MROZ2xF7WaNPaztA .error-icon{fill:#552222;}#mermaid-svg-MROZ2xF7WaNPaztA .error-text{fill:#552222;strok…

Android12 User版本開啟adb root, adb remount, su, 關閉selinux

開啟adb root 直接看adb源碼&#xff1a; __android_log_is_debuggable就是判斷ro.debuggable屬性值&#xff0c;感興趣可以在 源碼下grep下實現看看。auth_required :在adb源碼下定義的全局變量&#xff0c;默認等于true,。看名字就是是否需要用戶授權的flag, 這里不再繼續跟…

金融專業高分簡歷撰寫指南

一、金融求職簡歷原則&#xff1a;深度與亮點并存在金融行業求職時&#xff0c;一份出色的簡歷需突出經歷深度與亮點。01 教育背景需如實填寫畢業院校、專業、GPA及所學課程。金融行業不少公司對求職者學校和學歷有嚴格標準&#xff0c;如“985”“211”院校或碩士以上學歷等。…

專題:2025生命科學與生物制藥全景報告:產業圖譜、投資方向及策略洞察|附130+份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p43526 過去一年&#xff0c;全球生命科學VC融資回暖至1021.5億美元&#xff0c;并購交易雖下滑23%卻聚焦關鍵賽道&#xff0c;創新藥管線中GLP-1受體激動劑以170億美元市場規模領跑&#xff0c;AI技術將研發周期縮短60%……這些數據背…

Compose筆記(四十)--ClickableText

這一節主要了解一下Compose中的ClickableText&#xff0c;在Jetpack Compose中&#xff0c;ClickableText是用于創建可點擊文本的組件&#xff0c;其核心功能是通過聲明式語法將文本設置為交互式元素&#xff0c;用戶點擊時可觸發特定操作。簡單總結如下:API含義 text&#xff…

面試必刷的數組三連:原地刪除與合并

堅持用 清晰易懂的圖解 多語言代碼&#xff0c;讓每道題變得簡單&#xff01; 呆頭個人主頁詳情 呆頭個人Gitee代碼倉庫 呆頭詳細專欄系列 座右銘&#xff1a; “不患無位&#xff0c;患所以立。” 面試必刷的數組三連&#xff1a;原地刪除與合并前言目錄1.移除元素2.刪除有序…

力扣經典算法篇-41-旋轉圖像(輔助數組法,原地旋轉法)

1、題干 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像&#xff0c;這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。 示例 1&#xff1a;輸入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]]…

譯|用戶增長策略如何使用因果機器學習的案例

來自上傳文件中的文章《[Causal Machine Learning for Growth: Loyalty Programs, LTV, and What to Do When You Can’t Experiment | by Torty Sivill | Towards AI]》 本文探討了當 A/B 測試不可行時&#xff0c;如何利用因果推斷從歷史數據中獲取洞察。技術亮點在于通過構建…

java~final關鍵字

final關鍵字final基本介紹final的使用細節final基本介紹 final是最終的意思&#xff0c;可以修飾類&#xff0c;屬性&#xff0c;方法&#xff0c;局部變量什么時候會要使用到final呢&#xff1f; 1.想要類不被繼承時 2.不希望類的某個屬性的值被改變時 3.不想父類的某個方法被…

Node.js(四)之數據庫與身份認證

數據庫與身份認證 目錄 數據庫與身份認證 十三、數據庫的基本概念 13.1 什么是數據庫 13.2 常見的數據庫及分類 13.3 傳統型數據庫的數據組織結構 1. Excel 的數據組織結構 2. 傳統型數據庫的數據組織結構 3. 實際開發中庫、表、行、字段的關系 十四、安裝并配置MySQ…

SpringBoot+SpringMVC常用注解

文章目錄發展歷程項目創建項目結構入門案例配置文件的兩種方式&#xff1a;只能使用一種創建項目二入門案例常用知識及注解Controller:類上面加&#xff0c;SpringMVC的注解GetMapping:方法上面加Spring框架的兩項核心功能Component:組件。控制反轉&#xff0c;加在業務類上面&…

標準GS相位恢復算法

標準GS相位恢復算法詳解與MATLAB實現 Gerchberg-Saxton (GS) 算法是一種經典的相位恢復方法&#xff0c;廣泛應用于光學成像、衍射成像和全息技術等領域。該算法通過迭代過程從未知相位的強度測量中恢復相位信息。 算法原理 GS算法的核心思想是利用傅里葉變換關系在空間域和頻率…

【Linux網絡編程基礎--socket地址API】

一、主機字節序和網絡字節序主機字節序&#xff08;Host Byte Order&#xff09;&#xff1a;你當前電腦的內存字節順序&#xff08;比如 x86 是小端&#xff09;網絡字節序&#xff08;Network Byte Order&#xff09;&#xff1a;統一規定為大端序&#xff08;高位字節在高位…

Linux路徑MTU發現(Path MTU Discovery, PMTU)

Linux路徑MTU發現&#xff08;Path MTU Discovery, PMTU&#xff09;機制是TCP/IP協議棧中確保數據包高效傳輸的核心技術。其核心目標是動態探測源主機到目的主機路徑上的最小MTU&#xff08;Maximum Transmission Unit&#xff09;&#xff0c;從而避免IP分片&#xff0c;提升…

【MySQL進階】------MySQL程序

MySQL程序簡介 MySQL安裝完成通常會包含如下程序&#xff1a; Linux系統程序?般在 /usr/bin?錄下&#xff0c;可以通過命令查看&#xff1a; windows系統?錄&#xff1a;你的安裝路徑\MySQL Server 8.0\bin&#xff0c;可以通過命令查看&#xff1a; 每個 MySQL 程序都有許…

Linux大頁內存導致服務內存不足

Linux大頁內存導致服務內存不足的解決方法 大頁內存&#xff08;Huge Pages&#xff09;是Linux內核提供的一種機制&#xff0c;用于減少TLB&#xff08;轉換后備緩沖區&#xff09;的壓力&#xff0c;提高內存訪問性能。然而&#xff0c;如果配置不當&#xff0c;大頁內存可能…