leetcode - 904 水果成籃


在一排樹(shù)中,第 i 棵樹(shù)產(chǎn)生 tree[i] 型的水果。
你可以從你選擇的任何樹(shù)開(kāi)始,然后重復(fù)執(zhí)行以下步驟:

把這棵樹(shù)上的水果放進(jìn)你的籃子里。如果你做不到,就停下來(lái)。
移動(dòng)到當(dāng)前樹(shù)右側(cè)的下一棵樹(shù)。如果右邊沒(méi)有樹(shù),就停下來(lái)。
請(qǐng)注意,在選擇一顆樹(shù)后,你沒(méi)有任何選擇:你必須執(zhí)行步驟 1,然后執(zhí)行步驟 2,然后返回步驟 1,然后執(zhí)行步驟 2,依此類推,直至停止。

你有兩個(gè)籃子,每個(gè)籃子可以攜帶任何數(shù)量的水果,但你希望每個(gè)籃子只攜帶一種類型的水果。
用這個(gè)程序你能收集的水果總量是多少?

示例 1:

輸入:[1,2,1]
輸出:3
解釋:我們可以收集 [1,2,1]。
示例 2:

輸入:[0,1,2,2]
輸出:3
解釋:我們可以收集 [1,2,2].
如果我們從第一棵樹(shù)開(kāi)始,我們將只能收集到 [0, 1]。
示例 3:

輸入:[1,2,3,2,2]
輸出:4
解釋:我們可以收集 [2,3,2,2].
如果我們從第一棵樹(shù)開(kāi)始,我們將只能收集到 [1, 2]。
示例 4:

輸入:[3,3,3,1,2,1,1,2,3,3,4]
輸出:5
解釋:我們可以收集 [1,2,1,1,2].
如果我們從第一棵樹(shù)或第八棵樹(shù)開(kāi)始,我們將只能收集到 4 個(gè)水果。

解題思路

這題其實(shí)要求其實(shí)很簡(jiǎn)單,就是找出數(shù)組中長(zhǎng)度最大的連續(xù)由2種元素構(gòu)成的子數(shù)組,返回這個(gè)子數(shù)組的長(zhǎng)度。但由于本題有時(shí)間限制,只是樸素的解法會(huì)出現(xiàn)超時(shí)的情況,需要對(duì)實(shí)現(xiàn)進(jìn)行一定的優(yōu)化。

參考花花醬的hashtable+ sliding windows


花花醬解法
class Solution {
public:
// 樸素解法
    int totalFruit(vector<int>& tree) {
        int size = tree.size();
        int fruit[size] = {0};
        int max =0;
        
        for(int i = 0; i< size;i++){
            int number = 1;
            int type1 = -1;
            // 第一種水果
            type1 = tree[i];
            int type2 = -1;
            for(int j = i+1; j<size ;j++){
                // 第二種水果
                if(tree[j]!=tree[i]){
                    // type2 is null
                    if(type2 < 0){
                        type2 = tree[j];
                        number++;
                    }else{
                        // 出現(xiàn)第三種水果,跳出循環(huán)
                        if(tree[j] != type2){
                            break;
                        }else{
                            number++;
                        }
                    }
                    
                }else{
                    number++;
                }
            }
            fruit[i] = number;
            if(number> max)
                max = number;
        }
        return max;
    }
    
   
public:
// by [花花醬] (https://zxi.mytechroad.com/blog/hashtable/leetcode-904-fruit-into-baskets/)

  int totalFruit(vector<int>& tree) {        
    map<int, int> idx; // {fruit -> last_index}
    int ans = 0;
    int cur = 0;
    for (int i = 0; i < tree.size(); ++i) {
      int f = tree[i]; // 取一種水果
      if (!idx.count(f)) { // 返回值只有0或1
         // !idx.count(f) ==  1,即出現(xiàn)某種新水果時(shí)
        if (idx.size() == 2) { // 如果已經(jīng)有了兩種水果,再出現(xiàn)第三種水果的時(shí)候
          auto it1 = begin(idx); 
          auto it2 = next(it1);
          if (it1->second > it2->second) swap(it1, it2);
          // 找到之前兩種水果中,下標(biāo)最小的水果,開(kāi)始新的窗口
          cur = i - it1->second - 1; // cur存新窗口的大小       
          idx.erase(it1); // 刪除下標(biāo)較小的水果
        }       
      }   
      // 添加新水果的下標(biāo)信息
      idx[f] = i;  
      // 比較新窗口和上一個(gè)窗口的大小
      ans = max(++cur, ans);
    }
    return ans;
  }

};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,680評(píng)論 19 139
  • 項(xiàng)目團(tuán)建聚會(huì)時(shí),項(xiàng)目經(jīng)理可以和大家一起做的小游戲: 1、 猜數(shù)字 游戲規(guī)則: 猜數(shù)字(1~100)每猜一次范圍縮小...
    般若無(wú)相閱讀 2,046評(píng)論 0 0
  • 窮燈不窮 輝映不息 所有的開(kāi)始與結(jié)局都已寫(xiě)好 將斷章殘語(yǔ)行列交錯(cuò)編匯成孤本 你說(shuō) 迷茫、孤獨(dú)、晦澀難懂 我說(shuō) 執(zhí)著...
    雁北南鴻閱讀 305評(píng)論 2 3
  • 文/耿先生 1. 不得不說(shuō),看到五班群聊精華整理的那一刻,我被驚到了被嚇到了,更被深深的震撼了,而且,我相信有這個(gè)...
    耿先生閱讀 788評(píng)論 34 44

友情鏈接更多精彩內(nèi)容