Java?C++題解leetcode904水果成籃
題目要求
閱讀理解
讀完題的我be like:
去看了遍英文版就懂了,題目中的種類【type】不是種類數(shù)……每個(gè)數(shù)字代表一種樹【用個(gè)字母啥的表示或者翻譯成類型就好理解多了】,那么目標(biāo)就是找從哪里開始可以維持兩種數(shù)字(種類)無規(guī)律交替出現(xiàn)的狀態(tài)最久,這個(gè)最久是多少棵樹。
思路:滑動窗口
- 窗口里可放兩棵樹,一棵是棗樹,另一棵還是棗樹。 向后遍歷整排樹,并更新最長狀態(tài)。
Java
數(shù)組
class Solution { public int totalFruit(int[] fruits) { int res = 0; int[] win = new int[fruits.length + 10]; for (int l = 0, r = 0, tot = 0; r < fruits.length; r++) { if (++win[fruits[r]] == 1) tot++; // 當(dāng)前種類統(tǒng)計(jì) while (tot > 2) { if (--win[fruits[l++]] == 0) tot--; } res = Math.max(res, r - l + 1); // 維護(hù)最長狀態(tài) } return res; } }
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(n)
哈希表
可使用哈希表構(gòu)建窗口,降低空間復(fù)雜度。
- 鍵對應(yīng)籃子,值對應(yīng)同類樹數(shù)量;
- 當(dāng)值為000注意要徹底刪掉鍵。
class Solution { public int totalFruit(int[] fruits) { Map<Integer, Integer> win = new HashMap<Integer, Integer>(); int l = 0, res = 0; for (int r = 0; r < fruits.length; r++) { win.put(fruits[r], win.getOrDefault(fruits[r], 0) + 1); while (win.size() > 2) { // 窗口大小即種類數(shù) win.put(fruits[l], win.get(fruits[l]) - 1); if (win.get(fruits[l]) == 0) win.remove(fruits[l]); // 徹底刪除鍵值 l++; } res = Math.max(res, r - l + 1); } return res; } }
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(1)
C++
數(shù)組
class Solution { public: int totalFruit(vector<int>& fruits) { int res = 0; int win[fruits.size() + 10]; memset(win, 0, sizeof(win)); for (int l = 0, r = 0, tot = 0; r < fruits.size(); r++) { if (++win[fruits[r]] == 1) tot++; // 當(dāng)前種類統(tǒng)計(jì) while (tot > 2) { if (--win[fruits[l++]] == 0) tot--; } res = max(res, r - l + 1); // 維護(hù)最長狀態(tài) } return res; } };
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(n)
哈希表
可使用哈希表構(gòu)建窗口,降低空間復(fù)雜度。
class Solution { public: int totalFruit(vector<int>& fruits) { unordered_map<int, int> win; int l = 0, res = 0; for (int r = 0; r < fruits.size(); r++) { if (win.count(fruits[r])) win[fruits[r]]++; else win[fruits[r]] = 1; while (win.size() > 2) { // 窗口大小即種類數(shù) win[fruits[l]]--; if (win[fruits[l]] == 0) win.erase(fruits[l]); // 徹底刪除鍵值 l++; } res = max(res, r - l + 1); } return res; } };
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(1)
總結(jié)
- 今天不想rust了……主體和這兩種語言差不多,要多些類型轉(zhuǎn)換balabala的內(nèi)容
以上就是Java C++題解leetcode904水果成籃的詳細(xì)內(nèi)容,更多關(guān)于Java C++題解水果成籃的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java如何根據(jù)不同系統(tǒng)動態(tài)獲取換行符和盤分割符
這篇文章主要介紹了Java如何根據(jù)不同系統(tǒng)動態(tài)獲取換行符和盤分割符,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12java多線程關(guān)鍵字final和static詳解
這篇文章主要介紹了java多線程關(guān)鍵字final和static詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01JAVA實(shí)戰(zhàn)練習(xí)之圖書管理系統(tǒng)實(shí)現(xiàn)流程
隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對圖書館的日常工作進(jìn)行管理勢在必行,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)圖書管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-10-10java 交換兩個(gè)數(shù)據(jù)的方法實(shí)例詳解
這篇文章主要介紹了java 交換兩個(gè)數(shù)據(jù)的方法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12SPRING FRAMEWORK BEAN作用域和生命周期原理解析
這篇文章主要介紹了SPRING FRAMEWORK BEAN作用域和生命周期原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java
這篇文章主要介紹了零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java,很多朋友糾結(jié)這個(gè)問題,教材書不知道從何學(xué)起,今天小編給大家分享一篇教程幫助到家梳理這方面的知識2020-07-07