func largestSumAfterKNegations(nums []int, k int) int {
//按元素绝对值从大到小进行排序,注意math.Abs输入类型为float64
sort.Slice(nums, func(i, j int) bool {
return math.Abs(float64(nums[i])) > math.Abs(float64(nums[j]))
})
for i := 0; i < len(nums); i++ {
//贪心策略1:对绝对值最大的负数依次取反,消耗k
if nums[i] < 0 && k > 0 {
nums[i] *= -1
k--
}
}
//贪心策略2:对最小的正数反复取反消耗k,注意分k为奇数和偶数的情形
if k%2 == 1 {
nums[len(nums)-1] *= -1
}
res := 0
for i := 0; i < len(nums); i++ {
res += nums[i]
}
return res
}
func canCompleteCircuit(gas []int, cost []int) int {
curSum := 0 //统计剩余油量
totalSum := 0 //统计所有净增油量,若为负值则找不到起始索引
start := 0 //起始位置
for i := 0; i < len(gas); i++ {
totalSum += gas[i] - cost[i]
curSum += gas[i] - cost[i]
if curSum < 0 {
start = i + 1 //如果剩余油量为负数,起始位置为下一个元素
curSum = 0 //剩余油量重新计数
}
}
if totalSum < 0 {
return -1
}
return start
}
//135.分发糖果
func candy(ratings []int) int {
candy := make([]int, len(ratings))
// 初始化(每个人至少一个糖果)
for i := 0; i < len(ratings); i++ {
candy[i] = 1
}
//先从左到右遍历
for i := 1; i <= len(ratings)-1; i++ {
if ratings[i] > ratings[i-1] {
candy[i] = candy[i-1] + 1
}
}
//再从右到左遍历
for i := len(ratings) - 2; i >= 0; i-- {
if ratings[i] > ratings[i+1] {
candy[i] = max(candy[i], candy[i+1]+1)
}
}
//统计总的糖果数
sum := 0
for i := 0; i < len(ratings); i++ {
sum+=candy[i]
}
return sum
}