赞
踩
● 1005.K次取反后最大化的数组和
● 134. 加油站
● 135. 分发糖果
关联 leetcode 1005.K次取反后最大化的数组和
思路
题解
- func largestSumAfterKNegations(nums []int, k int) int {
- res := 0
- // 对数组按绝对值排序: 倒序排列,保证优先处理到的是最大的负数
- sort.Slice(nums, func(i, j int) bool {
- fi := float64(nums[i])
- fj := float64(nums[j])
- return math.Abs(fi) > math.Abs(fj)
- })
-
- for i := 0; i < len(nums); i++ {
- if nums[i] < 0 && k > 0 { //翻转负数
- nums[i] = -nums[i]
- k--
- }
- }
-
- // 翻转当前数组最小数剩下的k次
- if k%2 == 1 {//
- nums[len(nums)-1] *= -1
- }
-
- for _, num := range nums {
- res += num
- }
- return res
- }
关联 leetcode 134. 加油站
思路
题解
- func canCompleteCircuit(gas []int, cost []int) int {
- res := 0 //默认从第0号索引出发 即 第一个元素
- curSum, totalSum := 0, 0
-
- for i := 0; i < len(gas); i++ {
- curSum += gas[i] - cost[i]
- totalSum += gas[i] - cost[i] //总数直接累计
-
- if curSum < 0 { //当前累计剩余油量小于零, 从改该位置后一个位置开始出发
- res = i + 1 //从下一个位置开始
- curSum = 0 //curSum重新从0开始累计
- }
- }
- if totalSum < 0 { //总剩余油量totalSum小于0,说明无法环绕一圈
- return -1
- }
-
- return res
- }
关联 leetcode 135. 分发糖果
思路
题解
- func candy(ratings []int) int {
- res := 0
- //初始化分糖数组, 每个值都是1, 保证最小一颗
- candyArr := make([]int, len(ratings))
- for i := 0; i < len(candyArr); i++ {
- candyArr[i] = 1
- }
-
- //向右贪
- for i := 1; i < len(ratings); i++ {
- if ratings[i] > ratings[i-1] {
- candyArr[i] = candyArr[i-1] + 1
- }
- }
- //向左贪
- for i := len(ratings) - 1; i > 0; i-- {
- if ratings[i-1] > ratings[i] {
-
- candyArr[i-1] = max(candyArr[i-1], candyArr[i]+1)
- }
- }
- for _, c := range candyArr {
- res += c
- }
- return res
- }
- func max(a, b int) int {
- if a > b {
- return a
- }
- return b
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。