【python-leetcode904-滑动窗口法】水果成篮

问题描述:

在一排树中,第 i 棵树产生 tree[i] 型的水果。你可以从你选择的任何树开始,然后重复执行以下步骤:把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。移动到当前树右侧的下一棵树。如果右边没有树,就停下来。请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。用这个程序你能收集的水果总量是多少?

示例 1:

输入:[1,2,1]
输出:3
解释:我们可以收集 [1,2,1]。
示例 2:

输入:[0,1,2,2]
输出:3
解释:我们可以收集 [1,2,2].
如果我们从第一棵树开始,我们将只能收集到 [0, 1]。
示例 3:

输入:[1,2,3,2,2]
输出:4
解释:我们可以收集 [2,3,2,2].
如果我们从第一棵树开始,我们将只能收集到 [1, 2]。
示例 4:

输入:[3,3,3,1,2,1,1,2,3,3,4]
输出:5
解释:我们可以收集 [1,2,1,1,2].
如果我们从第一棵树或第八棵树开始,我们将只能收集到 4 个水果。

终于有一题不是会员的啦。

首先按照我们之前简单滑动窗口的思路,三要素:步长、左端、条件。

class Solution:
    def totalFruit(self, tree: List[int]) -> int:
        if len(tree) == 0:
            return 0
        if len(tree) <=2:
            return len(tree)
        tmp = 0 #用于记录满足条件得最大值
        for i in range(1,len(tree)+1):#步长从1到len(s)+1
            for j in range(len(tree)-i+1):#窗口左端
                if len(set(tree[j:j+i])) <= 2:#如果窗口中取集合后的不同字符小于等于2个
                    tmp = max(tmp,i)#更新tmp的值
        return tmp #最后返回即可

不出所料,超时了,不过也过了60个测试用例,说明这种方法是可行的。那么我们就要转变滑动窗口法另一种思路了。

第二种思路:一个hash表和一个左边界标记,max-num用于存储啊当前最佳值。 遍历数组将其加入到hash表中,,不同字符多于2个了, 就从左边开始删字符,直到hash表不同字符长度等于2,此时可得到的最大值max_num就是max(当前遍历到的位置-左边标记+1,max_num)

class Solution:
    def totalFruit(self, tree):
        if len(tree) == 0:
            return 0
        if len(tree) <= 2:
            return len(tree)
        start = 0  # 滑动窗口左端
        max_num = 0  # 用于计算最大值
        from collections import defaultdict
        hash = defaultdict(int)  # 用于存放当前获得的水果的种类
        for i in range(len(tree)):
            hash[tree[i]] += 1  # 遍历tree数组,将当前树水果加入到hash中
            print(hash)
            while len(hash) > 2:
                hash[tree[start]] -= 1
                if hash[tree[start]] == 0:
                    del hash[tree[start]]
                start += 1
            max_num = max(max_num, i - start + 1)
            print(max_num)
        return max_num

过程:

defaultdict(<class ‘int‘>, {3: 1})
1
defaultdict(<class ‘int‘>, {3: 2})
2
defaultdict(<class ‘int‘>, {3: 3})
3
defaultdict(<class ‘int‘>, {3: 3, 1: 1})
4
defaultdict(<class ‘int‘>, {3: 3, 1: 1, 2: 1})
4
defaultdict(<class ‘int‘>, {1: 2, 2: 1})
4
defaultdict(<class ‘int‘>, {1: 3, 2: 1})
4
defaultdict(<class ‘int‘>, {1: 3, 2: 2})
5
defaultdict(<class ‘int‘>, {1: 3, 2: 2, 3: 1})
5
defaultdict(<class ‘int‘>, {2: 1, 3: 2})
5
defaultdict(<class ‘int‘>, {2: 1, 3: 2, 4: 1})
5

leetcode上的结果:

原文地址:https://www.cnblogs.com/xiximayou/p/12292874.html

时间: 2024-10-15 00:57:26

【python-leetcode904-滑动窗口法】水果成篮的相关文章

多尺度滑动窗口法,multiple-scale sliding window method

当前的人体检测技术,基本都会采用到多尺度滑动窗口法,该方法需要对图像做不同尺度的缩放,然后用固定大小的滑动窗口以等距步长在整幅图像上滑动,并对每一个滑动窗口做人体检测. 因此,这个方法的最大优点就是漏检率极低,因为它会对整幅图像都滑动,不会漏掉任何一个可能会出现人体的位置.但是这种优势,是用巨大的搜索空间和时间消耗换来的,检测效率自然会受到较大的影响.这个方法的大致原理,可用下面的流程图演示. 我们以大小为480*640的图像为例,缩放尺度为1.1,首先构建图片中最左侧的金字塔(构建金字塔的结束

无重复字符的最长子串——滑动窗口法?

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke&qu

Python之滑动窗口

需求 对于一个数组array = ["n","v","l","f",...,"y","c","k"]; input 当前位置 index 数组的长度 arraySize 基于当前位置,(前/后)滑动窗口的元素数目 windowSize 即 滑动窗口(假定:包含当前元素 array[idx]) 总长:2*windowSize+1 output 滑动窗口中的元素下标数组

Leetcode-904 水果成篮

1 class Solution 2 { 3 public: 4 int totalFruit(vector<int>& tree) 5 { 6 vector<pair<int,int>> dealList; 7 int curType = tree[0]; 8 int curSum = 1; 9 for(int i = 1; i < tree.size(); i ++) 10 { 11 if(tree[i]==curType) 12 curSum ++;

Leetcode[274]H指数&amp;[904]水果成篮

最近忙于论文和实习,好久没有刷题了,之前立下的关于triplet loss的flag也莫得了. 某公司压力太大,已离职,希望利用好学生生涯最后一点时间,认认真真找个工作,扎扎实实提高自己技术水平. 其实这两道题都特别简单,均是自己在没有提示的情况下做出来的. 第一道题一个排序再一个遍历就结束了,我从没见过这么简单的medium,是因为我的方法太笨了吗? bool compare(const int a, const int b) {return b < a;} class Solution {

第二十六节,滑动窗口和 Bounding Box 预测

上节,我们学习了如何通过卷积网络实现滑动窗口对象检测算法,但效率很低.这节我们讲讲如何在卷积层上应用这个算法. 为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层.我们先讲解这部分内容,并演示卷积的应用过程. 一 卷积的滑动窗口实现 假设对象检测算法输入一个 14×14×3 的图像,图像很小,不过演示起来方便.在这里过滤器大小为 5×5,数量是 16, 14×14×3 的图像在过滤器处理之后映射为 10×10×16.然后通过参数为 2×2 的最大池化操作,图像减小到 5×

2. 滑动窗口和 Bounding Box 预测

滑动窗口和 Bounding Box 预测(转) 原文链接:https://www.cnblogs.com/zyly/p/9180485.html 目录 一 卷积的滑动窗口实现 二  Bounding Box 预测 上节,我们学习了如何通过卷积网络实现滑动窗口对象检测算法,但效率很低.这节我们讲讲如何在卷积层上应用这个算法. 为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层.我们先讲解这部分内容,并演示卷积的应用过程. 回到顶部 一 卷积的滑动窗口实现 假设对象检测算法

LeetCode-Minimum Window Substring-最小窗口子串-滑动窗口算法(尺取法)

https://oj.leetcode.com/problems/minimum-window-substring/ 线性复杂度的限制下,考虑使用滑动窗口法.这个方法的思路就是维持一个窗口,窗口向右边界扩张以满足限制条件.窗口左边界收缩以尽量使其最小. 注意这个题目可能是一个典型的滑动窗口方法的实现.外部循环移动左边界i,循环内部扩张右边界p以满足限制条件.并且内外都有终止可能. 使用两个map和一个计数变量以快速统计条件限制的满足情况. class Solution { public: int

滑动窗口(单调队列) C++版 Python版本

AcWing 154 滑动窗口  https://www.acwing.com/problem/content/156/ 给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能在窗口中看到k个数字. 每次滑动窗口向右移动一个位置. 以下是一个例子: 该数组为[1 3 -1 -3 5 3 6 7],k为3. 窗口位置 最小值 最大值 [1 3 -1] -3 5 3 6 7 -1 3 1 [3 -1 -3] 5 3 6 7 -3 3 1 3 [-