赞
踩
1005. K 次取反后最大化的数组和 - 力扣(LeetCode)
给你一个整数数组 nums
和一个整数 k
,按以下方法修改该数组:
i
并将 nums[i]
替换为 -nums[i]
。重复这个过程恰好 k
次。可以多次选择同一个下标 i
。
以这种方式修改数组后,返回数组 可能的最大和 。
解题思路:
要找到可能最大和,只需要局部每次将最小的只进行正负数转换。在所有数字都为整数的情况下,最小数变成负数对结果影响最小,如果有负数,最小数即最大负数,转换成正数增加nums和。
- class Solution:
- def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
- #pick the smallest number each time
- for i in range(k):
- smallest = min(nums)
- small_index = nums.index(smallest)
- nums[small_index] = -smallest
- return sum(nums)
在一条环路上有 n
个加油站,其中第 i
个加油站有汽油 gas[i]
升。
你有一辆油箱容量无限的的汽车,从第 i
个加油站开往第 i+1
个加油站需要消耗汽油 cost[i]
升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas
和 cost
,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1
。如果存在解,则 保证 它是 唯一 的。
解题思路:
贪心策略:通过实现局部耗油不低于0达到全局满足行程。
使用current_sum和total_sum分别记录当前gas容量,如果current_sum<0说明在此之前的站点不能作为起始点,start = i+1作为新的开始站点,current_sum = 0
- class Solution:
- def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
- start= 0
- current_sum= 0#indicate current gas left and if the start idx appropriate
- total_sum = 0#iterate all the gas and check if gas is sufficient
- for i in range(len(gas)):
- current_sum += gas[i] - cost[i]
- total_sum += gas[i] - cost[i]
- if current_sum<0:
- start = i+1
- current_sum = 0
- if total_sum<0:
- return -1
- return start
n
个孩子站成一排。给你一个整数数组 ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
1
个糖果。请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
解题思路:
本题需要逐步考虑左边比右边大和右边比左边大的情况。
left>right:
从左到右遍历,如果左边大的话直接设置左边比右边多一个
right>left:
从右到左遍历,选取自身ratings[i]与ratings[i+1]+1中最大值,从而利用第一次遍历时的ratings[i]
- class Solution:
- def candy(self, ratings: List[int]) -> int:
- candies = [1]*len(ratings)#give at least 1 candy to each kid
- for i in range(len(ratings)):
- if i>0 and ratings[i]>ratings[i-1]:
- candies[i] =candies[i-1]+1#right>left
- for i in range(len(ratings), -1, -1):#从右向左遍历,这样才能利用从左向右遍历时数值
- if i<len(ratings)-1 and ratings[i]>ratings[i+1]:
- candies[i] = max(candies[i], candies[i+1]+1)
- return sum(candies)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。