You are given an array nums consisting of positive integers.
Starting with score = 0, apply the following algorithm:
score.Return the score you get after applying the above algorithm.
Example 1:
Input: nums = [2,1,3,4,5,2] Output: 7 Explanation: We mark the elements as follows: - 1 is the smallest unmarked element, so we mark it and its two adjacent elements: [2,1,3,4,5,2]. - 2 is the smallest unmarked element, so we mark it and its left adjacent element: [2,1,3,4,5,2]. - 4 is the only remaining unmarked element, so we mark it: [2,1,3,4,5,2]. Our score is 1 + 2 + 4 = 7.
Example 2:
Input: nums = [2,3,5,1,3,2] Output: 5 Explanation: We mark the elements as follows: - 1 is the smallest unmarked element, so we mark it and its two adjacent elements: [2,3,5,1,3,2]. - 2 is the smallest unmarked element, since there are two of them, we choose the left-most one, so we mark the one at index 0 and its right adjacent element: [2,3,5,1,3,2]. - 2 is the only remaining unmarked element, so we mark it: [2,3,5,1,3,2]. Our score is 1 + 2 + 2 = 5.
Constraints:
1 <= nums.length <= 1051 <= nums[i] <= 106class Solution {
public long findScore(int[] nums) {
List<int[]> l = new ArrayList<>();
int n = nums.length;
long score = 0;
for (int i = 0; i < n; i++)
l.add(new int[] { nums[i], i });
// l.sort((a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]);
l.sort((a, b) -> a[0] - b[0]); // Stable sort, so not reqd. ^
for (int i = 0; i < n; i++) {
int[] top = l.get(i);
if (nums[top[1]] == 0)
continue;
score += top[0];
nums[top[1]] = 0;
if (top[1] > 0)
nums[top[1] - 1] = 0;
if (top[1] < n - 1)
nums[top[1] + 1] = 0;
}
return score;
}
}