[toc] leetcode .
题目描述
解题思路
法1
方法1.排序
-
先对数组进行排序,
-
反转尽可能多的负数
如果所有负数完全反转还有k(反转次数没有使用),并且为奇数,那么还要进行一次反转,
-
找到临界点,最小值出现的位置,就是负数反转结束的位置
-
计算数组的和并减去两倍的最小值(k反转完负数还是奇数的时候才减)
- 时间复杂度(O(nlogn))
- 空间复杂度(O(1))
执行结果
法1
func addar(nums []int)(r int){//数组和
for _, v := range nums {
r+=v
}
return
}
func min(x,y int)int{//较小的数字
if x>y {
return y
}
return x
}
func largestSumAfterKNegations(nums []int, k int) int {
sort.Ints(nums)
// 最大的将负数变为正数
i := 0
for ; k > 0 &&i<len(nums); i++ {
if nums[i] >= 0{
break
}
k--
nums[i] = -nums[i]
if i==len(nums)-1{break}
}
//临界点
if k%2==1 {//还需要进行一次反转
//临界位置的较小值进行反转
if i==0 {
return addar(nums)-2*nums[0]
}
return addar(nums)-2*min(nums[i],nums[i-1])
}
return addar(nums)
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 4 ms , 在所有 Go 提交中击败了 86.47% 的用户 内存消耗: 2.4 MB , 在所有 Go 提交中击败了 99.41% 的用户 通过测试用例: 81 / 81 炫耀一下:
本文由mdnice多平台发布