Java C++题解leetcode904水果成篮

2022-10-19 18:34:43
目录
题目要求阅读理解思路:滑动窗口Java数组哈希表C++数组哈希表总结

题目要求

阅读理解

读完题的我be>

去看了遍英文版就懂了,题目中的种类【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>