Welcome to Subscribe On Youtube

3282. Reach End of Array With Max Score

Description

You are given an integer array nums of length n.

Your goal is to start at index 0 and reach index n - 1. You can only jump to indices greater than your current index.

The score for a jump from index i to index j is calculated as (j - i) * nums[i].

Return the maximum possible total score by the time you reach the last index.

 

Example 1:

Input: nums = [1,3,1,5]

Output: 7

Explanation:

First, jump to index 1 and then jump to the last index. The final score is 1 * 1 + 2 * 3 = 7.

Example 2:

Input: nums = [4,3,1,3,2]

Output: 16

Explanation:

Jump directly to the last index. The final score is 4 * 4 = 16.

 

Constraints:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

Solutions

Solution 1: Greedy

Suppose we jump from index $i$ to index $j$, then the score is $(j - i) \times \text{nums}[i]$. This is equivalent to taking $j - i$ steps, and each step earns a score of $\text{nums}[i]$. Then we continue to jump from $j$ to the next index $k$, and the score is $(k - j) \times \text{nums}[j]$, and so on. If $\text{nums}[i] \gt \text{nums}[j]$, then we should not jump from $i$ to $j$, because the score obtained this way is definitely less than the score obtained by jumping directly from $i$ to $k$. Therefore, each time we should jump to the next index with a value greater than the current index.

We can maintain a variable $mx$ to represent the maximum value of $\text{nums}[i]$ encountered so far. Then we traverse the array from left to right until the second-to-last element, updating $mx$ each time and accumulating the score.

After the traversal, the result is the maximum total score.

The time complexity is $O(n)$, where $n$ is the length of the array $\text{nums}$. The space complexity is $O(1)$.

  • class Solution {
        public long findMaximumScore(List<Integer> nums) {
            long ans = 0;
            int mx = 0;
            for (int i = 0; i + 1 < nums.size(); ++i) {
                mx = Math.max(mx, nums.get(i));
                ans += mx;
            }
            return ans;
        }
    }
    
    
  • class Solution {
    public:
        long long findMaximumScore(vector<int>& nums) {
            long long ans = 0;
            int mx = 0;
            for (int i = 0; i + 1 < nums.size(); ++i) {
                mx = max(mx, nums[i]);
                ans += mx;
            }
            return ans;
        }
    };
    
    
  • class Solution:
        def findMaximumScore(self, nums: List[int]) -> int:
            ans = mx = 0
            for x in nums[:-1]:
                mx = max(mx, x)
                ans += mx
            return ans
    
    
  • func findMaximumScore(nums []int) (ans int64) {
    	mx := 0
    	for _, x := range nums[:len(nums)-1] {
    		mx = max(mx, x)
    		ans += int64(mx)
    	}
    	return
    }
    
    
  • function findMaximumScore(nums: number[]): number {
        let [ans, mx]: [number, number] = [0, 0];
        for (const x of nums.slice(0, -1)) {
            mx = Math.max(mx, x);
            ans += mx;
        }
        return ans;
    }
    
    

All Problems

All Solutions