func largestSumAfterKNegations(A []int, K int) int {
sort.Ints(A)
var negatives int
var zeros int
var positives int
var negativeAry []int
var positiveAry []int
for n := range A {
if A[n] < {
negatives++
negativeAry = append(negativeAry, A[n])
} else if A[n] == {
zeros++
} else {
positives++
positiveAry = append(positiveAry, A[n])
}
}
var sum int
if K <= negatives { //只需要把负数变正数,把最小的(绝对值大的)K个负数变正数
for i := ; i < K; i++ {
sum += negativeAry[i] * -
}
for i := K; i < negatives; i++ {
sum += negativeAry[i]
}
for i := ; i < positives; i++ {
sum += positiveAry[i]
}
} else { //将全部的负数都变成正数,还不够
if zeros > || (K-negatives)% == {
//剩下的变化次数,全变0,或者反复的变偶数次同一个正数(也可以是一个已经变成正数的负数)
for i := ; i < negatives; i++ {
sum += negativeAry[i] * -
}
for i := ; i < positives; i++ {
sum += positiveAry[i]
}
} else {
//先把负数的绝对值累加
for i := ; i < negatives; i++ {
sum += negativeAry[i] * -
} //再把正数的绝对值累加
for i := ; i < positives; i++ {
sum += positiveAry[i]
} //判断全部已经都变成正数的数组中,绝对值最小的数字
//将绝对值最小的这个数字,减2次
if (negatives == && positives > ) || (positives > && negatives > && positiveAry[] <= negativeAry[negatives-]*-) {
sum += positiveAry[] * -
return sum
}
if (positives == && negatives > ) || (positives > && negatives > && positiveAry[] > negativeAry[negatives-]*-) {
sum += negativeAry[negatives-] *
return sum
}
} }
return sum
}

上面这个一定觉得很啰嗦,那就来个简单的:

 func largestSumAfterKNegations(A []int, K int) int {
sort.Ints(A)
i :=
for i < len(A) && K > && A[i] < {
A[i] = -A[i]
i++
K--
}
sum :=
sort.Ints(A)
for j := range A {
sum += A[j]
}
if K > && K% == {
min := A[]
sum -= min *
}
return sum
}

思想是一样的,但是简洁了很多。而且由于没有使用新数组保存正和负数,所以空间占用更小。

第一部分代码是思维的过程,第二部分代码是提炼之后的。leetcode上面的题目,大部分都可以用20,30行就搞定。如果代码特别长,那应该是没有抓住问题的本质,这样的代码思维可能把自己绕进去,别人看不懂,甚至自己也会看迷糊。

最后,go的效率的确是棒棒的:

leetcode1005的更多相关文章

  1. [Swift]LeetCode1005. K 次取反后最大化的数组和 | Maximize Sum Of Array After K Negations

    Given an array A of integers, we must modify the array in the following way: we choose an i and repl ...

  2. LeetCode1005 K次取反后最大化的数组和(贪心+Java简单排序)

    题目: 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修 ...

随机推荐

  1. 【springboot】之整合ActiveMQ

    1.引入依赖的jar <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. VMWare VSphere6.0的实验笔记

    在现有的一个vsphere6.0虚拟平台上环境下搭建一套VSphere环境平台. 任务1: 1.建立1个win2008主机,192.168.12.10.16Gram,40G硬盘1独立存储+150G硬盘 ...

  3. 流媒体技术笔记(DarwinStreamingServer相关)

    简介 Darwin Streaming Server简称DSS.DSS是Apple公司提供的开源实时流媒体播放服务器程序.整个程序使用C++编写,在设计上遵循高性能,简单,模块化等程序设计原则,务求做 ...

  4. bzoj4183: tree

    Description 自底向上模拟,原地操作以节省空间 #include<bits/stdc++.h> unsigned n,a,b,c,v[],mx,ans=; int main(){ ...

  5. 珍藏的数据库SQL基础练习题答案

    自己珍藏的数据库SQL基础练习题答案 一,基本表的定义与删除. 题1: 用SQL语句创建如下三张表:学生(Student),课程表(Course),和学生选课表(SC),这三张表的结构如表1-1到表1 ...

  6. HDOJ 2007 平方和与立方和

    #include<iostream> #include<algorithm> using namespace std; int main() { int m, n; while ...

  7. python直接下载图片到内存

    1. 使用requests(推荐) from PIL import Image import requests Image.open(requests.get(url, stream=True).ra ...

  8. 阿里云线上ROS静态路由转发,有大坑。

    原因见上去,阿里云不支持VPC中转流量,VPC1和VPC2都在国内,VPC3在香港,如果按阿里云的做法,必须付费2次国际隧道的钱,才可以实现三个VPC互通.明显很浪费钱. 所以我们只能在三个VPC,各 ...

  9. [UE4]GameplayAbilities,技能系统插件

    Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(七)Ability的信息传递等   Unreal Engine 4(虚幻UE4)GameplayAbili ...

  10. [UE4]需要保存的数据

    数据存储原则是“相关的放在一起,不相关的分开”. 如果存档有几十上百兆,如果放在一起存储容易出现问题(特别是网络游戏):断线.电脑死机.游戏出错等等,存档就会损坏,所以一定要分割存储.