代码随想录二刷Day34
今日任务
1005.K次取反后最大化的数组和
134.加油站
135.分发糖果
语言:Go
1005. K次取反后最大化的数组和
链接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/
func largestSumAfterKNegations(nums []int, k int) int {
sum := 0
sort.Ints(nums)
for i := 0; i < len(nums); i++ {
if nums[i] < 0 && k > 0 {
nums[i] = -nums[i]
k--
} else {
break
}
}
sort.Ints(nums)
if k % 2 == 1 {
nums[0] = -nums[0]
}
for i := 0; i < len(nums); i++ {
sum += nums[i]
}
return sum
}
134. 加油站
链接:https://leetcode.cn/problems/gas-station/
func canCompleteCircuit(gas []int, cost []int) int {
curSum := 0
totalSum := 0
startIdx := 0
for i := 0; i < len(gas); i++ {
curSum += gas[i] - cost[i]
totalSum += gas[i] - cost[i]
if curSum < 0 {
startIdx = i + 1
curSum = 0
}
}
if totalSum < 0 {
return -1
}
return startIdx
}
135. 分发糖果
链接:https://leetcode.cn/problems/candy/
每次只考虑一边
func candy(ratings []int) int {
candy := make([]int, len(ratings))
candy[0] = 1
for i := 1; i < len(ratings); i++ {
if ratings[i] > ratings[i - 1] {
candy[i] = candy[i - 1] + 1
} else if ratings[i] < ratings[i - 1] {
candy[i] = 1
if candy[i - 1] == 1 {
candy[i - 1] = 2
}
} else if ratings[i] == ratings[i - 1] {
candy[i] = 1
}
}
for i := len(ratings) - 2; i >= 0; i-- {
if ratings[i] > ratings[i + 1] {
if candy[i] < candy[i + 1] + 1 {
candy[i] = candy[i + 1] + 1
}
}
}
sum := 0
for i := 0; i < len(ratings); i++ {
sum += candy[i]
}
return sum
}