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.) 以这种方式修 ...
随机推荐
- ALGO-22_蓝桥杯_算法训练_数的划分(DP)
问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=,k=,下面三种分法被认为是相同的. ,,; ,,; ,,; 问有多少种不同的分法. 输入格式 n,k 输出格式 ...
- java中遍历实体类,获取属性名和属性值
方式一(实体类): //java中遍历实体类,获取属性名和属性值 public static void testReflect(Object model) throws Exception{ for ...
- Quartz不用配置文件配置启动
StdSchedulerFactory schedulerFactory = null; try { schedulerFactory = new StdSchedulerFactory(); Pro ...
- 【事务隔离级别】数据库事务隔离级别-UNDERSTANDING ISOLATION LEVELS
参考链接:ISOLATION LEVELS ISOLATION LEVELS In a database system, concurrent transactions are processed i ...
- HashMap的自定义实现
一.背景: HashMap到底是怎么实现的? 一对一对的存放,通过key找value:map的键不能重复:自己怎么实现呢? 代码: Wife.java 辅助类 package com.cy.co ...
- slot内容分发
vue实现了一套内容分发的API,这套API基于当前的web components规范草案,将<slot>元素作为承载分发内容的出口. 在前面的父子组件中,我们提到过,在vue中,组件实例 ...
- stopPropagation()阻止事件的冒泡传递
<!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...
- 安装httpd服务配置
本地yum源安装 mkdir /opt/dvd (先用mkdir去根下opt目录下建一个名字叫dvd的目录) mount /dev/sr0 /opt/dvd (用mount命令,挂载光盘设备 ...
- 市值3万亿的facebook再出丑闻,你的数据,到底应该归谁?
最近一则<Facebook隐私泄露事件继续发酵,黑客明码标价出售聊天信息>的新闻被爆出,一个用户的信息被标价10美分.让人不禁感慨,3万亿市值的facebook,用户数据竟然如此便宜. 在 ...
- Jmeter(七)Jmeter脚本优化(数据与脚本分离)
午休时间再来记一记,嗯..回顾着使用Jmeter的历程,想着日常都会用到的一些功能.一些组件:敲定了本篇的主题----------是的.脚本优化. 说起脚本优化,为什么要优化?又怎么优化?是个永恒的话 ...