From 20ba08f1c44b64e2f3b29191d99a9e5fe096c9ce Mon Sep 17 00:00:00 2001 From: YDZ Date: Wed, 1 May 2019 09:01:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20problem=201005?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Maximize Sum Of Array After K Negations.go | 19 +++++ ...ize Sum Of Array After K Negations_test.go | 72 +++++++++++++++++++ .../README.md | 46 ++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 Algorithms/1005. Maximize Sum Of Array After K Negations/1005. Maximize Sum Of Array After K Negations.go create mode 100644 Algorithms/1005. Maximize Sum Of Array After K Negations/1005. Maximize Sum Of Array After K Negations_test.go create mode 100644 Algorithms/1005. Maximize Sum Of Array After K Negations/README.md diff --git a/Algorithms/1005. Maximize Sum Of Array After K Negations/1005. Maximize Sum Of Array After K Negations.go b/Algorithms/1005. Maximize Sum Of Array After K Negations/1005. Maximize Sum Of Array After K Negations.go new file mode 100644 index 00000000..eb47d5d9 --- /dev/null +++ b/Algorithms/1005. Maximize Sum Of Array After K Negations/1005. Maximize Sum Of Array After K Negations.go @@ -0,0 +1,19 @@ +package leetcode + +import "sort" + +func largestSumAfterKNegations(A []int, K int) int { + sort.Ints(A) + minIdx := 0 + for i := 0; i < K; i++ { + A[minIdx] = -A[minIdx] + if minIdx == len(A)-1 || A[minIdx+1] < A[minIdx] { + minIdx++ + } + } + sum := 0 + for _, a := range A { + sum += a + } + return sum +} diff --git a/Algorithms/1005. Maximize Sum Of Array After K Negations/1005. Maximize Sum Of Array After K Negations_test.go b/Algorithms/1005. Maximize Sum Of Array After K Negations/1005. Maximize Sum Of Array After K Negations_test.go new file mode 100644 index 00000000..9e256ecd --- /dev/null +++ b/Algorithms/1005. Maximize Sum Of Array After K Negations/1005. Maximize Sum Of Array After K Negations_test.go @@ -0,0 +1,72 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question1005 struct { + para1005 + ans1005 +} + +// para 是参数 +// one 代表第一个参数 +type para1005 struct { + one []int + two int +} + +// ans 是答案 +// one 代表第一个答案 +type ans1005 struct { + one int +} + +func Test_Problem1005(t *testing.T) { + + qs := []question1005{ + + question1005{ + para1005{[]int{4, 2, 3}, 1}, + ans1005{5}, + }, + question1005{ + para1005{[]int{3, -1, 0, 2}, 3}, + ans1005{6}, + }, + + question1005{ + para1005{[]int{2, -3, -1, 5, -4}, 2}, + ans1005{13}, + }, + + question1005{ + para1005{[]int{-2, 9, 9, 8, 4}, 5}, + ans1005{32}, + }, + + question1005{ + para1005{[]int{5, -7, -8, -3, 9, 5, -5, -7}, 7}, + ans1005{49}, + }, + + question1005{ + para1005{[]int{5, 6, 9, -3, 3}, 2}, + ans1005{20}, + }, + + question1005{ + para1005{[]int{8, -7, -3, -9, 1, 9, -6, -9, 3}, 8}, + ans1005{53}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 1005------------------------\n") + + for _, q := range qs { + _, p := q.ans1005, q.para1005 + fmt.Printf("【input】:%v 【output】:%v\n", p, largestSumAfterKNegations(p.one, p.two)) + } + fmt.Printf("\n\n\n") +} diff --git a/Algorithms/1005. Maximize Sum Of Array After K Negations/README.md b/Algorithms/1005. Maximize Sum Of Array After K Negations/README.md new file mode 100644 index 00000000..5a95c601 --- /dev/null +++ b/Algorithms/1005. Maximize Sum Of Array After K Negations/README.md @@ -0,0 +1,46 @@ +# [1005. Maximize Sum Of Array After K Negations](https://leetcode.com/problems/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 replace A[i] with -A[i], and we repeat this process K times in total. (We may choose the same index i multiple times.) + +Return the largest possible sum of the array after modifying it in this way. + + +Example 1: + +```c +Input: A = [4,2,3], K = 1 +Output: 5 +Explanation: Choose indices (1,) and A becomes [4,-2,3]. +``` + +Example 2: + +```c +Input: A = [3,-1,0,2], K = 3 +Output: 6 +Explanation: Choose indices (1, 2, 2) and A becomes [3,1,0,2]. +``` + +Example 3: + +```c +Input: A = [2,-3,-1,5,-4], K = 2 +Output: 13 +Explanation: Choose indices (1, 4) and A becomes [2,3,-1,5,4]. +``` + +Note: + +- 1 <= A.length <= 10000 +- 1 <= K <= 10000 +- -100 <= A[i] <= 100 + +## 题目大意 + +将数组中的元素变成它的相反数,这种操作执行 K 次之后,求出数组中所有元素的总和最大。 + +这一题可以用最小堆来做,构建最小堆,每次将最小的元素变成它的相反数。然后最小堆调整,再将新的最小元素变成它的相反数。执行 K 次以后求数组中所有的值之和就是最大值。 + +这道题也可以用排序来实现。排序一次,从最小值开始往后扫,依次将最小值变为相反数。这里需要注意一点,负数都改变成正数以后,接着不是再改变这些变成正数的负数,而是接着改变顺序的正数。因为这些正数是比较小的正数。负数越小,变成正数以后值越大。正数越小,变成负数以后对总和影响最小。具体实现见代码。