Java?C++題解leetcode904水果成籃
題目要求


閱讀理解
讀完題的我be like:
去看了遍英文版就懂了,題目中的種類【type】不是種類數(shù)……每個(gè)數(shù)字代表一種樹(shù)【用個(gè)字母啥的表示或者翻譯成類型就好理解多了】,那么目標(biāo)就是找從哪里開(kāi)始可以維持兩種數(shù)字(種類)無(wú)規(guī)律交替出現(xiàn)的狀態(tài)最久,這個(gè)最久是多少棵樹(shù)。
思路:滑動(dòng)窗口
- 窗口里可放兩棵樹(shù),一棵是棗樹(shù),另一棵還是棗樹(shù)。 向后遍歷整排樹(shù),并更新最長(zhǎng)狀態(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ù)最長(zhǎng)狀態(tài)
}
return res;
}
}
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(n)
哈希表
可使用哈希表構(gòu)建窗口,降低空間復(fù)雜度。
- 鍵對(duì)應(yīng)籃子,值對(duì)應(yīng)同類樹(shù)數(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ù)最長(zhǎng)狀態(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了……主體和這兩種語(yǔ)言差不多,要多些類型轉(zhuǎn)換balabala的內(nèi)容
以上就是Java C++題解leetcode904水果成籃的詳細(xì)內(nèi)容,更多關(guān)于Java C++題解水果成籃的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java?C++刷題leetcode1106解析布爾表達(dá)式
- Java C++題解leetcode816模糊坐標(biāo)示例
- Java C++題解leetcode 1684統(tǒng)計(jì)一致字符串的數(shù)目示例
- Java?C++題解leetcode764最大加號(hào)標(biāo)志示例
- Java C++題解leetcode915分割數(shù)組示例
- Java?C++題解leetcode902最大為N的數(shù)字組合數(shù)位DP
- Java?C++?leetcode面試零矩陣
- Java C++題解leetcode1620網(wǎng)絡(luò)信號(hào)最好的坐標(biāo)
相關(guān)文章
淺談java socket的正確關(guān)閉姿勢(shì)
這篇文章主要介紹了java socket的正確關(guān)閉姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡(jiǎn)單實(shí)現(xiàn)(小結(jié))
這篇文章主要介紹了談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡(jiǎn)單實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐
MyBatis-Plus是基于MyBatis的持久層增強(qiáng)工具,提供簡(jiǎn)化CRUD、代碼生成器、條件構(gòu)造器、分頁(yè)及樂(lè)觀鎖等功能,極大簡(jiǎn)化了開(kāi)發(fā)工作量并提高了開(kāi)發(fā)效率,本文就來(lái)介紹一下SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐,感興趣的可以了解一下2024-11-11
Java?ynchronized重量級(jí)鎖的核心原理詳解
這篇文章主要為大家詳細(xì)介紹了Java?ynchronized重量級(jí)鎖的核心原理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
Mybatis往Mapper.xml文件中傳遞多個(gè)參數(shù)問(wèn)題
這篇文章主要介紹了Mybatis往Mapper.xml文件中傳遞多個(gè)參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
強(qiáng)烈推薦MyBatis?三種批量插入方式的比較
這篇文章主要介紹了強(qiáng)烈推薦MyBatis?三種批量插入方式的比較,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
解決springboot上傳圖片后無(wú)法立即訪問(wèn)需重啟的問(wèn)題
這篇文章主要介紹了解決springboot上傳圖片后無(wú)法立即訪問(wèn)需重啟的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

