L48.【LeetCode題解】904. 水果成籃

目錄

1.題目

2.分析

方法1:暴力枚舉

方法2:暴力解法的優化:滑動窗口

代碼

方法3:優化方法2:使用數組充當哈希表

方法4:四個變量分別充當籃子和籃子中水果的個數(最快!!!)

代碼

容易忽略的點


1.題目

https://leetcode.cn/problems/fruit-into-baskets/

你正在探訪一家農場,農場從左到右種植了一排果樹。這些樹用一個整數數組 fruits 表示,其中 fruits[i] 是第 i 棵樹上的水果 種類

你想要盡可能多地收集水果。然而,農場的主人設定了一些嚴格的規矩,你必須按照要求采摘水果:

  • 你只有 兩個 籃子,并且每個籃子只能裝 單一類型 的水果。每個籃子能夠裝的水果總量沒有限制。
  • 你可以選擇任意一棵樹開始采摘,你必須從 每棵 樹(包括開始采摘的樹)上 恰好摘一個水果 。采摘的水果應當符合籃子中的水果類型。每采摘一次,你將會向右移動到下一棵樹,并繼續采摘。
  • 一旦你走到某棵樹前,但水果不符合籃子的水果類型,那么就必須停止采摘。

給你一個整數數組 fruits ,返回你可以收集的水果的 最大 數目。

示例 1:

輸入:fruits = [1,2,1]
輸出:3
解釋:可以采摘全部 3 棵樹。

示例 2:

輸入:fruits = [0,1,2,2]
輸出:3
解釋:可以采摘 [1,2,2] 這三棵樹。
如果從第一棵樹開始采摘,則只能采摘 [0,1] 這兩棵樹。

示例 3:

輸入:fruits = [1,2,3,2,2]
輸出:4
解釋:可以采摘 [2,3,2,2] 這四棵樹。
如果從第一棵樹開始采摘,則只能采摘 [1,2] 這兩棵樹。

示例 4:

輸入:fruits = [3,3,3,1,2,1,1,2,3,3,4]
輸出:5
解釋:可以采摘 [1,2,1,1,2] 這五棵樹。

提示:

  • 1 <= fruits.length <= 10^5
  • 0 <= fruits[i] < fruits.length

2.分析

需要使用set來統計[left,right]之間水果的種類數

方法1:暴力枚舉

class Solution {
public:int totalFruit(vector<int>& fruits) {int left=0,right=0,ret=0;for (;left<fruits.size();left++){set<int> mp;for (right=left;right<fruits.size();right++){mp.insert(fruits[right]);if (mp.size()>2)break;}       ret=max(ret,right-left);}return ret;}
};

提交結果:超時

方法2:暴力解法的優化:滑動窗口

right不用每次都從left開始枚舉,以這個為例:[1,2,1,2,3,2,3,3]

當mp.size()>2時,

left只需要向前移動,直到mp.size()\leqslant2時停止移動,能減少大量無用的循環,提高運行速度

使用存儲雙關鍵字類型的map<int,int>,第一個關鍵字存儲類型,第二個關鍵字存儲每類的水果的個數

可以先mp[fruits[right]]++(進窗口),看看mp.size()有沒有超過2,如果超過,使mp[fruits[left++]]--(出窗口),如果發現減到0了,就erase(注:erase直接刪除掉節點的所有信息, 不是讓mp[x]置為0)

最后更新結果:ret=max(ret,right-left+1);

代碼

class Solution {
public:int totalFruit(vector<int>& fruits) {map<int,int> mp;int left=0,right=0,ret=0; for (;right<fruits.size();right++){mp[fruits[right]]++;while (mp.size()==3){mp[fruits[left++]]--;if (mp[fruits[left-1]]==0)mp.erase(fruits[left-1]);}ret=max(ret,right-left+1);}return ret;}
};

提交結果:

當然也可以使用unordered_map解決:

但無論是map還是unordered_map對mp多次插入和刪除比較耗時,時間復雜度較高,可以使用方法3:數組充當哈希表

方法3:優化方法2:使用數組充當哈希表

要多用一個變量kind來存儲水果種類的數量,因為1 <= fruits.length <= 10^5 使用哈希數組hash[100001]來存儲,哈希數組的特點正好符合對雙關鍵字的要求,對于種類為x的水果,其個數為hash[x]

kind++的條件:hash[fruit[right]]從0變成1

kind--的條件:hash[fruit[right]]從1變成0

class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001]={0};int left=0,right=0,ret=0,kind=0; for (;right<fruits.size();right++){hash[fruits[right]]++;if (hash[fruits[right]]==1)kind++;while (kind==3){hash[fruits[left++]]--;if (hash[fruits[left-1]]==0)kind--;}ret=max(ret,right-left+1);}return ret;}
};

提交結果:

方法4:四個變量分別充當籃子和籃子中水果的個數(最快!!!)

bkt1存儲籃子1的水果種類數,籃子1的水果個數為bkt1_num(bkt為basket的簡寫)

bkt2存儲籃子2的水果種類數,籃子1的水果個數為bkt2_num

代碼

class Solution {
public:int totalFruit(vector<int>& fruits){int bkt1 = -1, bkt2 = -1, bkt1_num = 0, bkt2_num = 0;int left = 0, right = 0, ret = 0;for (; right < fruits.size(); right++){if (bkt1 == -1){bkt1 = fruits[right];bkt1_num++;}else if (bkt2 == -1&&fruits[right]!=bkt1){bkt2 = fruits[right];bkt2_num++;}else{if (fruits[right] == bkt1)bkt1_num++;else if (fruits[right] == bkt2)bkt2_num++;else//如果出現第三種水果{while (1){if (fruits[left] == bkt1)bkt1_num--;elsebkt2_num--;left++;if (bkt1_num == 0){bkt1 = fruits[right];bkt1_num++;break;}if (bkt2_num == 0){bkt2 = fruits[right];bkt2_num++;break;}}}}ret = max(ret, right - left + 1);}return ret;}
};

容易忽略的點

else if (bkt2 == -1&&fruits[right]!=bkt1)的fruits[right]!=bkt1不可以省,否則將無法通過[0,0,1,1]測試用例

提交結果:

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

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

相關文章

Leetcode-BFS問題

LeetCode-BFS問題 1.Floodfill問題 1.圖像渲染問題 [https://leetcode.cn/problems/flood-fill/description/](https://leetcode.cn/problems/flood-fill/description/) class Solution {public int[][] floodFill(int[][] image, int sr, int sc, int color) {//可以借助另一…

Typora+PicGo+Gitee圖床配置教程 自動圖片上傳

配置步驟 #mermaid-svg-aPUbWs43XR5Rh7vf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aPUbWs43XR5Rh7vf .error-icon{fill:#552222;}#mermaid-svg-aPUbWs43XR5Rh7vf .error-text{fill:#552222;stroke:#552222;}#…

養生:開啟健康生活的全新篇章

養生是一場關乎生活品質與身心健康的持續修行&#xff0c;從飲食調養到運動鍛煉&#xff0c;從睡眠管理到心態塑造&#xff0c;每個環節都對健康有著深遠影響。以下為你提供全面且實用的養生指南。 飲食養生&#xff1a;科學膳食&#xff0c;滋養生命 合理的飲食是養生的根基…

Python | 赤道頻散關系圖

寫在前面 寫開題報告&#xff0c; 想用個圖發現截出來全是糊的。索性自己畫了&#xff0c;主要實現的Matsuno&#xff08;1966&#xff09;的赤道波動頻散關系圖。但是&#xff0c;實在是沒有審美&#xff0c;其他文獻里都是黑色&#xff0c;這里非要用個紫色&#xff0c;因為…

Nexus 私有倉庫 + Nginx 反向代理部署文檔

1. 使用 Podman 部署 Nexus 3 podman run --name nexus -d \-p 8081:8081 \-v /data:/nexus-data \-v /etc/localtime:/etc/localtime \-e TZ"Asia/Shanghai" \-e INSTALL4J_ADD_VM_PARAMS"-Xms10240m -Xmx10240m -XX:MaxDirectMemorySize4096m" \docker.…

一.Gitee基本操作

一.初始化 1.git init初始化倉庫 git init 用于在當前目錄下初始化一個本地 Git 倉庫&#xff0c;讓這個目錄開始被 Git 跟蹤和管理。 生成 .git 元數據目錄&#xff0c;從而可以開始進行提交、回退、分支管理等操作。 2.git config user.name/user.email配置本地倉庫 # 設置…

力扣210(拓撲排序)

210. 課程表 II - 力扣&#xff08;LeetCode&#xff09; 這是一道拓撲排序的模板題。簡單來說&#xff0c;給出一個有向圖&#xff0c;把這個有向圖轉成線性的排序就叫拓撲排序。如果有向圖中有環就沒有辦法進行拓撲排序了。因此&#xff0c;拓撲排序也是圖論中判斷有向無環圖…

華為ensp實現跨vlan通信

要在網絡拓撲中實現主機192.168.1.1、192.168.1.2和192.168.2.1之間的互相通信&#xff0c;需要正確配置交換機&#xff08;S5700&#xff09;和路由器&#xff08;AR3260&#xff09;&#xff0c;以確保不同網段之間的通信&#xff08;即VLAN間路由&#xff09;。 網絡拓撲分析…

熱部署與雙親委派

熱部署初探與雙親委派機制 一、熱部署初探 ? 熱部署就是在不重啟服務的情況下&#xff0c;無需重新啟動整個應用&#xff0c;就能對代碼、配置等進行更新并使新的更改在服務中生效。以下代碼可以打破雙親委派機制&#xff0c;利用類加載器的隔離實現熱部署。可分為以下三步進…

AWS SNS:解鎖高并發消息通知與系統集成的云端利器

導語 在分布式系統架構中&#xff0c;如何實現高效、可靠的消息通知與跨服務通信&#xff1f;AWS Simple Notification Service&#xff08;SNS&#xff09;作為全托管的發布/訂閱&#xff08;Pub/Sub&#xff09;服務&#xff0c;正在成為企業構建彈性系統的核心組件。本文深度…

驅動開發硬核特訓 · Day 30(下篇): 深入解析 lm48100q I2C 音頻編解碼器驅動模型(基于 i.MX8MP)

作者&#xff1a;嵌入式Jerry 視頻教程請關注 B 站&#xff1a;“嵌入式Jerry” 一、背景與目標 在本篇中&#xff0c;我們圍繞 TI 的 lm48100q 音頻編解碼器 展開&#xff0c;深入講解其作為 I2C 外設如何集成至 Linux 內核音頻子系統&#xff08;ASoC&#xff09;&#xff0…

idea寫spark程序

步驟 1&#xff1a;創建 Maven 項目 打開 IntelliJ IDEA&#xff0c;選擇 File > New > Project。選擇 Maven&#xff0c;勾選 Create from archetype&#xff0c;選擇 org.apache.maven.archetypes:maven-archetype-quickstart。填寫 GroupId&#xff08;如 com.exampl…

【C語言練習】032. 編寫帶參數的函數

032. 編寫帶參數的函數 032. 編寫帶參數的函數1. 定義帶參數的函數示例1:定義一個帶參數的函數輸出結果2. 傳遞多個參數示例2:定義一個帶多個參數的函數輸出結果3. 傳遞數組作為參數示例3:定義一個帶數組參數的函數輸出結果4. 傳遞結構體作為參數示例4:定義一個帶結構體參數…

Java虛擬機的基本結構

jvm它包含以下部分 第一個&#xff1a;類加載系統 類加載子系統&#xff0c;負責類的加載。類加載器有三種類型&#xff1a;引導類加載器、擴展類加載器、應用程序類加載器。 第二個&#xff1a;運行時數據區 包含了程序計數器、Java虛擬機棧、本地方法棧、堆 、方法區。 程…

uniapp引入七魚客服微信小程序SDK

小程序引入七魚sdk 1.微信公眾平臺引入2.代碼引入3.在pagesQiyu.vue初始化企業appKey4.跳轉打開七魚客服 1.微信公眾平臺引入 賬號設置->第三方設置->添加插件->搜索 QIYUSDK ->添加 2.代碼引入 在分包中引入插件 "subPackages": [{"root":…

手撕算法(定制整理版2)

最長無重復子字符串 class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""if not s:return 0max_len 0tp []for a in s:while a in tp:del tp[0]tp.append(a)if len(tp) > max_len:max_len len(…

數字IC后端培訓教程之數字后端項目典型案例分析

今天給大家分享下最近小編幫助學員解決的幾個經典數字IC后端項目問題。希望能夠對大家的學習和工作有所幫助。 數字IC后端項目典型問題之后端實戰項目問題記錄&#xff08;2025.04.24&#xff09; 數字IC后端設計實現培訓教程&#xff08;整理版&#xff09; Q1: 老師好&…

window 顯示驅動開發-將虛擬地址映射到內存段(二)

在將虛擬地址映射到段的一部分之前&#xff0c;視頻內存管理器調用顯示微型端口驅動程序的 DxgkDdiAcquireSwizzlingRange 函數&#xff0c;以便驅動程序可以設置用于訪問可能重排的分配位的光圈。 驅動程序既不能將偏移量更改為訪問分配的 PCI 光圈&#xff0c;也不能更改分配…

Termius ssh連接服務器 vim打開的文件無法復制問題

你的問題是&#xff1a; ? 在 Termius (macOS) SSH 連接到 VMware Ubuntu&#xff0c;使用 vim 打開 .cpp 文件時&#xff0c;可以復制文本&#xff1b; ? 但在 Windows 10 上 SSH 到 VMware 的 Red Hat 6.4 時&#xff0c;復制操作無效。 ? &#x1f3af; 初步分析 復制…

楊校老師項目之基于SSM與JSP的鮮花銷售系統-【成品設計含文檔】

基于SSMJSP鮮花商城系統 隨著電子商務的快速發展&#xff0c;鮮花在線銷售已成為一種重要的消費模式。本文設計并實現了一個基于JSP技術的鮮花銷售管理系統&#xff0c;采用B/S架構&#xff0c;使用SSM框架進行開發&#xff0c;并結合Maven進行項目依賴管理。系統分為前臺用戶模…