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. react-router 4.x

    本次主要总结react中的路由的使用,实现让根组件根据用户访问的地址动态挂载不同的组件. 1,创建项目 首先使用命令 npx create-react-app react-router创建项目,然后n ...

  2. 客户端负载均衡Feign之一:申明式服务调用Feign入门示例

    Spring Cloud提供了Ribbon和Feign作为客户端的负载均衡. 前面使用了Ribbon做客户端负载均衡,使用Hystrix做容错保护,这两者被作为基础工具类框架被广泛地应用在各个微服务的 ...

  3. 数据仓库与ODS

    1. 引言 本篇主要讲述操作数据存储(ODS)系统产生的背景.定义.特点,以及它与数据仓库的区别.在前两篇,笔者介绍了什么是数据仓库?为什么需要数据仓库?数据仓库系统的体系结构是什么?因此可能在读者心 ...

  4. google chrome浏览器 程序无法启动并行配置不正确

    启动电脑后打开chrome弹出如下信息: 系统:win7 进入chrome的安装路径 C:\Program Files (x86)\Google\Chrome\Application 两个版本文件夹, ...

  5. 自定义锁屏图片 win7

    win + R打开运行对话框 输入Regedit 点确定 进入注册表,找到以下项次 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersi ...

  6. ODBC数据源管理器-》系统DSN-》没有....Microsoft Access Driver(*mdb,*,accdb)

    问题如标题: 解决方法:打开目录:“C:\Windows\SysWOW64”,双击该目录下的“odbcad32.exe”文件,就进去ODBC数据源管理界面了,现在这个界面中就有access的驱动了!

  7. spark streaming检查点使用

    import org.apache.spark._ import org.apache.spark.streaming._ /** * Created by code-pc on 16/3/14. * ...

  8. delphi EncdDecd.pas单元中Encoding方法出现#$D#$A的解决方法

    例如: s:= 'http://detail.tmall.com/item.htm?id=45545826531&abbucket=_AB-M129_B17&acm=03130.100 ...

  9. (转)SQL知识_SQL Case when 的使用方法

    原文地址:http://www.cnblogs.com/yazdao/archive/2009/12/09/1620482.html Case具有两种格式.简单Case函数和Case搜索函数. --简 ...

  10. python+bs4+urllib

    # -*- coding: utf-8 -*- # # # from bs4 import BeautifulSoup import urllib2 import sys reload(sys) sy ...