1399. Take Coins
中文English
There aren
coins in a row, each time you want to take a coin from the left or the right side. Take a total of k
times to write an algorithm to maximize the value of coins.
Example
Example 1:
Input: list = [5,4,3,2,1], k = 2
Output :9
Explanation:Take two coins from the left.
Example 2:
Input: list = [5,4,3,2,1,6], k = 3,
Output:15
Explanation:Take two coins from the left and one from the right.
Notice
1 <= k <= n <= 100000
。- The value of the coin is not greater than
10000
。
Greedy. Two pointers from the start and end of the array, respectively. Each time get the larger value until k times. The reason it doesn't work is one example [4, 1, 1, 1, 6, 1] and k = 2. For the greedy. We take 4 and 1, so the value is 5. However, the max value we can get is to get 6 and 1, which is 7 instead.
Correct Solution:
The correct solution is we can take k from left, then 0 from right, e.g.
from left from right
k 0
k - 1 1
k - 2 2
... ...
0 k
So the solution is we first get sum of the first k elements from the left. And then each time we get one from right, we substract from the left side.
Code (Java):
public class Solution { /** * @param list: The coins * @param k: The k * @return: The answer */ public int takeCoins(int[] list, int k) { // Write your code here if (list == null || list.length == 0) { return 0; } int sum = 0; int maxSum = 0; int left = 0; int right = list.length - 1; for (left = 0; left < k; left++) { sum += list[left]; } maxSum = sum; // left pointer back off by one left--; while (left >= 0) { sum -= list[left]; left--; sum += list[right]; right--; maxSum = Math.max(maxSum, sum); } return maxSum; } }
No comments:
Post a Comment