iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Java C++题解leetcode904水果成篮
  • 974
分享到

Java C++题解leetcode904水果成篮

Java C++ 题解水果成篮Java C++ LeetCode 2022-11-13 18:11:08 974人浏览 安东尼
摘要

目录题目要求阅读理解思路:滑动窗口Java数组哈希表c++数组哈希表总结题目要求 阅读理解 读完题的我be like: 去看了遍英文版就懂了,题目中的种类【type】不是种类数&

题目要求

阅读理解

读完题的我be like:

去看了遍英文版就懂了,题目中的种类【type】不是种类数……每个数字代表一种树【用个字母啥的表示或者翻译成类型就好理解多了】,那么目标就是找从哪里开始可以维持两种数字(种类)无规律交替出现的状态最久,这个最久是多少棵树。

思路:滑动窗口

  • 窗口里可放两棵树,一棵是枣树,另一棵还是枣树。 向后遍历整排树,并更新最长状态。

Java

数组

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++; // 当前种类统计
            while (tot > 2) {
                if (--win[fruits[l++]] == 0)
                    tot--;
            }
            res = Math.max(res, r - l + 1); // 维护最长状态
        }
        return res;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

哈希表

可使用哈希表构建窗口,降低空间复杂度。

  • 键对应篮子,值对应同类树数量;
  • 当值为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) { // 窗口大小即种类数
                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;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

C++

数组

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++; // 当前种类统计
            while (tot > 2) {
                if (--win[fruits[l++]] == 0)
                    tot--;
            }
            res = max(res, r - l + 1); // 维护最长状态
        }
        return res;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

哈希表

可使用哈希表构建窗口,降低空间复杂度。

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) { // 窗口大小即种类数
                win[fruits[l]]--;
                if (win[fruits[l]] == 0)
                    win.erase(fruits[l]); // 彻底删除键值
                l++;
            }
            res = max(res, r - l + 1);
        }
        return res;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

总结

  • 今天不想rust了……主体和这两种语言差不多,要多些类型转换balabala的内容

以上就是Java C++题解LeetCode904水果成篮的详细内容,更多关于Java C++题解水果成篮的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java C++题解leetcode904水果成篮

本文链接: https://www.lsjlt.com/news/169686.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作