leetcode1005
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的更多相关文章
- [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 ...
- LeetCode1005 K次取反后最大化的数组和(贪心+Java简单排序)
题目: 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修 ...
随机推荐
- java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec 解决方案
使用java生成图片的时候,报了java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec 错误. 根据这个类的api说明,在 ...
- STL基础--算法(修改数据的算法)
修改元素的算法 copy, move, transform, swap, fill, replace, remove vector<int> vec = {9,60,70,8,45,87, ...
- 【并发】基于 @Async和 CompletableFuture 实现并发异步操作
参考链接:Spring官方示例 User.java package hello; import com.fasterxml.jackson.annotation.JsonIgnorePropertie ...
- QT 5 初学1 多窗口切分-续
转载:omydocument 主窗口本身就带着菜单,工具栏,和状态栏,作为一个基本应用,这些都不用操心. 一个工具,需要把窗口切分成三部分,左边,右上,右下.左边显示选择的功能,右上是主窗口.右下作为 ...
- scroll家族属性
上一篇主要分析了一下offset家族属性,本篇文章则主要是来分析一下scroll家族属性. 首先,scroll家族包括4个属性: 网页正文宽度:document.body.scrollWidth; 网 ...
- SFINAE简单实例
SFINAE(Substitution failure is not an error),是C++11以来推出的一个重要概念,这里,只是简单举一个例子,可能会有人需要. // 添加 scalar nu ...
- grafana 指标视图嵌入到其他html网页
我们开发了一套管理平台用来监控整个系统环境的运行情况,但是在指标信息这块不想重新开发,而想直接拿grafana来用,刚开始的时候我们的管理平台和grafana是完全独立的,只能从我们平台跳转到graf ...
- openstack热添加磁盘
假定在虚拟机当中添加了磁盘,但是虚拟机没有识别出来:如何识别出来 可以使用命令 echo '- - -' >/sys/class/scsi_host/host0/scan 使用后就可以识别出来了 ...
- 哈希表(Hash Table)原理及其实现
原理 介绍 哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映 ...
- 修改了jdk在环境变量中的路径怎么cmd中的jdk版本没有变
把path路径下的jdk配置放在前面%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot ...