# 拿最多的苹果 ## 背景 现在有个列表,每个下标对应一个位置,每个位置上的值,对应有多少个苹果,现在只有2步,在任意两步,可以摘多少苹果。 a = [1,2,0,3] b = [1,3,3,6] 从0到3,可以拿到6-1 =5个苹果
# coding:utf-8 """ 前言: 两种走法: 第一种:从startPos开始,往左走,到达left点,然后尽力向right走 第一步:从startPos到left,这中间走了:startPos-left 第二步:由于总步数位k,那么,能往右走的距离为:k-(startPos-left) 第三步:那么最终可以到达的位置是:min(n,left+k-(startPos-left)) n 表示 第四步:这个位置可能在startPos的左边,因此走过的区间是:[left, max(startPos, min(n, left + k - (startPos - left)))] 第五步:之后的问题就是计算区间内水果的数目并更新答案 第二种:从startPos开始,往右走,到达right点,然后尽力向left走 """ class Solution(object): def maxTotalFruits(self, fruits, startPos, k): """ :type fruits: List[List[int]] :type startPos: int :type k: int :rtype: int """ n = max(fruits[-1][0], startPos) # fruits[-1][0] 为水果的最右侧,得到移动区间的right s = [0] * (n + 1) # 按照最右侧的数,来创建横坐标的空值,问题:为什么要是9个呢? for pos, amount in fruits: # 以fruit中的横坐标为s的下标,值为fruit对应的amount,意思是: s[pos] = amount for index in range(1, n + 1): ## 这块的作用是? 行走的方法分为两种,从左再往右,从右再往左,name s[index] += s[index - 1] print(s) print(list(range(max(0, startPos - k), startPos + 1))) res = 0 # 可摘水果的个数 # 从startPos,从左边开始,可摘水果个数 for left in range(max(0, startPos - k), startPos + 1): # 找出最左边的区域,如果startPos>k,说明一直往左走的坐标为:startPos-k,如果startPos<k,说明一直往左走会小于0,这个时候,我们需要的最左边的坐标为:0 right = max(startPos, min(left + k - (startPos - left), n)) # 5 = max(5,min(1+4-(5-1),8)) print('********_____',left,right) cnt = s[right] # 8 if left > 0: cnt -= s[left - 1] #8-=s[0] 8-=8 print(cnt) res = max(res, cnt) # 从startPos,从右边开始, 右边可摘水果个数 for right in range(startPos + 1, min(n, startPos + k) + 1): # range(6,min(8,5+4)+1) range(6,9) left = min(startPos, max(right - (k - (right - startPos)), 0)) # min(5,max(6-(4-(6-5)),0)) left = 3 cnt = s[right] # print('&&&&&&&_____',left,right) if left > 0: cnt -= s[left - 1] # print(cnt) res = max(res, cnt) return res a = Solution() fruits = [[2,8],[6,3],[8,6]] startPos = 5 k = 4 # fruits = [[0,3],[6,4],[8,5]] # startPos = 3 # k = 2 c = a.maxTotalFruits(fruits,startPos,k) print(c)
本文作者:Eric
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!