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. 【git】之clone(克隆)

    直接克隆 git clone https://github.com/gyjx/test.git 指定克隆某个分支 git clone -b dev https://github.com/gyjx/te ...

  2. uoj#158. 【清华集训2015】静态仙人掌

    http://uoj.ac/problem/158 预处理dfs序,询问转为区间1的个数,用可持久化bitset预处理出所有可能的修改对应哪些位置,然后用一个bitset维护当前每个点的状态,修改时可 ...

  3. 计时器setInterval()

    在执行时,从载入页面后每隔指定的时间执行代码. 语法: setInterval(代码,交互时间); 参数说明: 1. 代码:要调用的函数或要执行的代码串. 2. 交互时间:周期性执行或调用表达式之间的 ...

  4. [转]Windows7:Visual Studio 2008试用版的评估期已经结束解决方法

    原文来自:http://blog.sina.com.cn/s/blog_6b1815080100y5z3.html     以前在Windows2003碰到这个问题时,都是到"控制面板→添加 ...

  5. BOF、EOF 属性

    BOF.EOF 属性 BOF 指示当前记录位置位于 Recordset 对象的第一个记录之前. EOF 指示当前记录位置位于 Recordset 对象的最后一个记录之后. 返回值 BOF 和 EOF  ...

  6. 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类

    1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...

  7. openstack处理booting from hard disk

    当你的实例启动出现如下报错的处理方式:         需要编辑/etc/nova/nova.conf [libvirt] cpu_mode = none virt_type=qemu   修改后需要 ...

  8. imageLoader之介绍

    相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在ListVie ...

  9. 解决在word中不能使用输入法

    打开一个Word文档-------------->单击 文件---->选项---->高级---->取消什么?看图 然后重新启动word

  10. ipv6 操作

    netsh interface teredo set state disablednetsh interface ipv6 add v6v4tunnel interface=IP6Tunnel 120 ...