1. 合并列表中字典字段
如下两个列表,需要将oldList转化为newList,去掉相同字段的字典,并且去掉的参数里面的值要相加。
oldList = [{'0-0': 0, '0-1': 0, '0-2': 0, '0-3': 1972}, {'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0}, {'0-0': 0, '0-1': 0, '0-2': 0, '0-3': 1450}, {'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0}, {'0-0': 0, '0-1': 0, '0-2': 0, '0-3': 1334}] newList = [{'0-0': 0, '0-1': 0, '0-2': 0, '0-3': 4756}, {'3-3': 406, '3-2': 0, '3-1': 0, '3-0': 0}]
代码:
import operator oldList = [{'0-0': 0, '0-1': 0, '0-2': 0, '0-3': 1972}, {'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0}, {'0-0': 0, '0-1': 0, '0-2': 0, '0-3': 1450}, {'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0}, {'0-0': 0, '0-1': 0, '0-2': 0, '0-3': 1334}] newList = [] newList.append(oldList[0]) for t in range(1,len(oldList)): for li in newList: if operator.eq(li.keys(), oldList[t].keys()): for key in li.keys(): li[key] += oldList[t][key] break elif operator.eq(li,newList[-1]): newList.append(oldList[t]) break print(newList)
输出:
[{'0-0': 0, '0-1': 0, '0-2': 0, '0-3': 4756}, {'3-3': 406, '3-2': 0, '3-1': 0, '3-0': 0}]
2. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
代码:
class Solution: def maxProduct(self, nums: list) -> int: if len(nums) == 0: return 0 length = len(nums) dp = [[0] * 2 for _ in range(length)] dp[0][0] = nums[0] dp[0][1] = nums[0] for i in range(1, length): if nums[i] > 0: dp[i][0] = min(nums[i], dp[i - 1][0] * nums[i]) dp[i][1] = max(nums[i], dp[i - 1][1] * nums[i]) else: dp[i][0] = min(nums[i], dp[i - 1][1] * nums[i]) dp[i][1] = max(nums[i], dp[i - 1][0] * nums[i]) res = dp[0][1] for i in range(1, length): res = max(res, dp[i][1]) return res if __name__ == '__main__': s = Solution() print (s.maxProduct([2,3,-2,4])) print (s.maxProduct([-2,0,-1]))
输出:
6
0
3. 加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。
示例 1:
输入:
gas = [1,2,3,4,5]
cost = [3,4,5,1,2]
输出: 3
解释: 从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油 开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油 开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油 开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油 开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油 开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。 因此,3 可为起始索引。
示例 2:
输入:
gas = [2,3,4]
cost = [3,4,3]
输出: -1
解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。 我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油 开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油 开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油 你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。 因此,无论怎样,你都不可能绕环路行驶一周。
代码:
class Solution(object): def canCompleteCircuit(self, gas, cost): """ :type gas: List[int] :type cost: List[int] :rtype: int """ n = len(gas) if sum(gas) < sum(cost): return -1 else: start = 0 path = 0 for i in range(n): path = path + (gas[i] - cost[i]) if path < 0: start = i + 1 path = 0 return start if __name__ == '__main__': s = Solution() gas = [1,2,3,4,5] cost = [3,4,5,1,2] print(s.canCompleteCircuit(gas, cost)) gas = [2,3,4] cost = [3,4,3] print(s.canCompleteCircuit(gas, cost))
输出:
3
-1
附录
贪心算法
又称贪婪算法, greedy algorithm
是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。
一般步骤
①建立数学模型来描述问题 。
②把求解的问题分成若干个子问题 。
③对每个子问题求解,得到子问题的局部最优解 。
④把子问题的解局部最优解合成原来解问题的一个解 。
贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯 。
使用条件
利用贪心法求解的问题应具备如下2个特征:
1、贪心选择性质
一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
2、最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心法求解的关键所在。在实际应用中,至于什么问题具有什么样的贪心选择性质是不确定的,需要具体问题具体分析。
存在问题
贪心算法也存在如下问题:
1、不能保证解是最佳的。因为贪心算法总是从局部出发,并没从整体考虑 ;
2、贪心算法一般用来解决求最大或最小解 ;
3、贪心算法只能确定某些问题的可行性范围 。
应用实例
例如,平时购物找零钱时,为使找回的零钱的硬币数最少,不要求找零钱的所有方案,而是从最大面值的币种开始,按递减的顺序考虑各面额,先尽量用大面值的面额,当不足大面值时才去考虑下一个较小面值,这就是贪心算法。
有很多经典的应用,比如霍夫曼编码,普利姆和克鲁斯卡尔最小生成树算法,还有迪杰斯特拉单源最短路径算法,都是使用了这种思维。
(附录部分摘自百度百科)