LeetCode 2391收集垃圾的最少总时间(如何优雅的遍历)





题目不难,中等+评级3,不考察算法和数据结构,但是考察很多细节和思路。

自己踩的坑

自己一开始写的代码,没有注意到“垃圾车不用遍历所有的房子”,也就是说如果后面的房子都不在有某种垃圾了,则不用向后遍历了。

自己一开始是将后面所有的字符串相加,然后查找,结果超时了。

后面自己改正了思路,在开垃圾车前(?),先对字符串数据进行遍历。找到每种垃圾最后出现的位置,后面的房子就不用便利了。
代码如下:

class Solution:
    def garbageCollection(self, garbage: List[str], travel: List[int]) -> int:
        ans = 0
        str_g = 'PGM'
        n = len(garbage)
        for g in str_g:
            least = 0
            for i in range(n):
                if garbage[i].find(g) != -1:
                    least = i

            for i in range(0,least+1):
                now = garbage[i].find(g)
                while now != -1:
                    ans += 1
                    # print('在',i,'收拾垃圾',g,',总耗时',ans)
                    garbage[i] = garbage[i][:now]+garbage[i][now+1:]
                    now = garbage[i].find(g)
                
                if i != n-1 and i<least:
                    ans += travel[i]
                    # print('从',i,'去',i+1,'总耗时',ans)
        return ans

大佬的思路一:多次遍历

看了灵山大佬的思路,只能说真的巧妙:




先让垃圾车跑满全程,再倒着遍历garbage,减去多跑的时间。

class Solution:
    def garbageCollection(self, garbage: List[str], travel: List[int]) -> int:
        ans = sum(map(len, garbage)) + sum(travel)*3

        for c in 'MPG':
            for g, t in zip(reversed(garbage), reversed(travel)):
                if c in g:
                    break
                ans -= t

        return ans

几个学习到的技巧:

  1. map函数的用法:接受2个参数,第一项是函数,第二项是可迭代对象(如列表)。返回一个迭代器,包含每个元素应用函数后的结果。例如:

    def double(i):
     return 2*i
    
    l = [1,2,3,4,5]
    
    res = map(double, l)
    
    for i in res:
     print(i)
    
    #打印:2 4 6 8 10

    作者这里通过map(len,garbage),获得了garbage每个字符串的长度,然后通过sum()函数累加,得到了所有字符串的总长度。

  2. 倒序遍历列表,可以直接使用reverse(garbage),不用傻乎乎的通过range(n-1,-1,-1)来遍历下标。
  3. 老生常谈的用zip()来同时遍历2个列表,自己老是记不住
  4. 判断字符串是否包含某子字符串,直接用in就好了。

    a = 'abcd'
    print('a' in a)     # 打印: True
    print('aaa' in a)   # 打印: False

声明:奋斗小刘|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - LeetCode 2391收集垃圾的最少总时间(如何优雅的遍历)


Make Everyday Count