3038. Maximum Number of Operations With the Same Score I
Problem Description
In this problem, we have an array of integers called nums
. We are allowed to remove pairs of elements from the start of the array. Each time we remove a pair, we calculate the sum of the two elements and consider this the score of the operation. The goal is to perform as many operations as possible with the condition that all operations must yield the same score. This means that each pair of elements we remove must have the same sum as the first pair we removed.
To find the maximum number of operations we can perform under these conditions, we need to continuously check the first two elements of the remaining array, removing them only if they match the desired score. If at any point the sum of the two elements doesn't match the score, we must stop the operations, and that's the maximum number we can perform.
Intuition
To solve this problem, the solution begins by presuming that the score we need every operation to match is the sum of the first two elements in the array, denoted as s
. The solution then proceeds to traverse the array in steps of 2, meaning it looks at every consecutive pair of elements.
During this traversal, the solution checks if the sum of each pair matches the initial score s
. As soon as it encounters a pair that does not have a sum equal to s
, or if there are no more pairs to check (e.g., after removing pairs the array has only one element left), the traversal stops. This is grounded in the rule that all operations must yield the same score, and since the score is defined by the first operation, any pair that doesn't match this score would break the condition.
We therefore increase our count of operations with every valid pair. This counting stops when an invalid pair is found or there are less than 2 elements in the array (i.e., it is not possible to perform any more operations).
Solution Approach
The implemented solution follows a straightforward and direct approach. It doesn't employ complex algorithms or data structures but relies on a simple traversal of the array using a for loop.
Here's a step-by-step explanation of the implementation:
-
The solution initializes a variable
s
with the sum of the first two elements innums
. Thiss
will be the score that every operation must match.s = nums[0] + nums[1]
-
It initializes an answer variable,
ans
, to count the number of operations performed and a variablen
to store the length of the array.ans, n = 0, len(nums)
-
The solution uses a for loop to iterate over the elements of the array in steps of two, looking at every pair of elements.
for i in range(0, n, 2):
-
For each pair, it checks two conditions: whether the current index
i + 1
equals the length of the array (which would mean there's no pair left to process) and whether the sum of the current pair does not match the scores
.if i + 1 == n or nums[i] + nums[i + 1] != s: break
If either condition is true, the loop breaks, effectively stopping any further operations, as either there are no more pairs to remove or the condition of maintaining the same score can no longer be met.
-
If none of the conditions for breaking the loop are met, it means that the current pair matches the score, and an operation can be performed. The
ans
variable is incremented to reflect this.ans += 1
-
The loop continues until it has either checked all elements in the array or encountered a break. At the end of the loop, the solution returns the count
ans
, which represents the maximum number of operations that have been performed with the same score.return ans
This solution assumes that the input array nums
has already been set up such that every valid operation (pair with matching sum s
) is adjacent and that there are no possible operations (pairs with the desired sum) after encountering the first invalid one. Therefore, it's essential to confirm that the input array will conform to these conditions; otherwise, the solution might not correctly calculate the maximum number of operations.
Ready to land your dream job?
Unlock your dream job with a 2-minute evaluator for a personalized learning plan!
Start EvaluatorExample Walkthrough
Let's illustrate the solution approach with a simple example.
Suppose we have the following array of integers as our nums
:
nums = [4, 6, 4, 6, 8, 2]
We will walk through the steps of the implementation using this array.
-
First, we initialize the variable
s
with the sum of the first two elements innums
, which is 4 + 6 = 10.s = nums[0] + nums[1] # s = 10
-
We initialize our answer variable,
ans
, to 0 and a variablen
to store the length of the array, which is 6 in this case.ans, n = 0, len(nums) # ans = 0, n = 6
-
The for loop begins and will iterate over the pairs of elements.
for i in range(0, n, 2):
-
At first,
i = 0
, and we look at the first pairnums[0] + nums[1]
which is 4 + 6. This equalss
(10), so we can remove this pair. Nobreak
is encountered, and we incrementans
.# First iteration: # nums[0] + nums[1] = 10, which is equal to s. ans += 1 # ans = 1
-
Now
i = 2
, and we look at the next pairnums[2] + nums[3]
which is 4 + 6. This also equalss
(10), so we remove this pair as well. We incrementans
.# Second iteration: # nums[2] + nums[3] = 10, which is equal to s. ans += 1 # ans = 2
-
Finally,
i = 4
, and we look at the last pairnums[4] + nums[5]
which is 8 + 2. This equals 10, the same ass
. Even though it matchess
, we're at the end of the array, so the loop naturally concludes.# Third iteration: # nums[4] + nums[5] = 10, which is equal to s. However, this is the last pair. ans += 1 # ans = 3
-
The loop finishes because there are no more elements in
nums
. The solution will return the countans
, which is 3 in this case.return ans # returns 3
This example shows that the array nums
allowed for 3 pairs to be removed with the sum matching s = 10
, hence 3 operations were performed. The example follows the method of sequential checking and early termination if the condition is not met. In this instance, the conditions were satisfied by all element pairs, so the maximum number of operations is equal to the number of pairs in the array.
Solution Implementation
1from typing import List
2
3class Solution:
4 def maxOperations(self, nums: List[int]) -> int:
5 # Check if there are enough numbers to form pairs.
6 if len(nums) < 2:
7 return 0
8
9 # Initialize the sum of the first pair and the answer counter.
10 sum_of_pair = nums[0] + nums[1]
11 operations_count = 0
12 total_numbers = len(nums)
13
14 # Iterate through the list in steps of 2 to form pairs.
15 for i in range(0, total_numbers, 2):
16 # Check whether we reached the end or if the sum of the current pair doesn't match sum_of_pair.
17 if i + 1 == total_numbers or nums[i] + nums[i + 1] != sum_of_pair:
18 break
19 # If we found a matching pair, increment the counter.
20 operations_count += 1
21
22 # Return the total pairs formed.
23 return operations_count
24
1public class Solution {
2 public int maxOperations(int[] nums) {
3 // Calculate the sum of the first pair of elements in the array
4 int targetSum = nums[0] + nums[1];
5
6 // Initialize a counter for the number of valid operations
7 int operationsCount = 0;
8
9 // Length of the nums array
10 int n = nums.length;
11
12 // Loop through the array in pairs, up to the second-to-last element (i + 1 < n)
13 for (int i = 0; i + 1 < n; i += 2) {
14 // Check if the current pair sums up to the target sum
15 if (nums[i] + nums[i + 1] == targetSum) {
16 // If it does, increment the operations counter
17 ++operationsCount;
18 } else {
19 // If a pair doesn't sum up to the target sum, break out of the loop
20 // No need to continue as subsequent operations will not be valid
21 break;
22 }
23 }
24
25 // Return the total number of valid operations
26 return operationsCount;
27 }
28}
29
1#include <vector>
2using namespace std;
3
4class Solution {
5public:
6 // Function to determine the maximum number of operations where each operation consists of
7 // finding a pair of elements from the array that add up to the same value
8 int maxOperations(vector<int>& nums) {
9 // Initialize the sum "s" with the sum of the first two elements
10 int target_sum = nums[0] + nums[1];
11 // Initialize the answer, which stores the number of valid operations
12 int operations_count = 0;
13 // Get the size of the nums array
14 int n = nums.size();
15
16 // Iterate over the elements of the vector in pairs
17 for (int i = 0; i + 1 < n && nums[i] + nums[i + 1] == target_sum; i += 2) {
18 // If the sum of the current pair of elements equals the target sum, increment the operations count
19 ++operations_count;
20 }
21 // Return the total number of valid operations
22 return operations_count;
23 }
24};
25
1function maxOperations(nums: number[]): number {
2 // Initialize a sum 'requiredSum' with the sum of the first two elements.
3 const requiredSum = nums[0] + nums[1];
4
5 // 'n' represents the total number of elements in the 'nums' array.
6 const n = nums.length;
7
8 // 'operationsCount' will hold the number of valid operations performed.
9 let operationsCount = 0;
10
11 // Iterate over the 'nums' array with a step of 2.
12 for (let i = 0; i + 1 < n; i += 2) {
13 // Check if the current and next element sum up to the 'requiredSum'.
14 if (nums[i] + nums[i + 1] === requiredSum) {
15 // Increment the count of valid operations if the condition is met.
16 operationsCount++;
17 } else {
18 // If the condition is not met, break the loop as it's assumed that nums were initially arranged in pairs with the same sum.
19 break;
20 }
21 }
22
23 // Return the total number of operations performed.
24 return operationsCount;
25}
26
Time and Space Complexity
The time complexity of the code is O(n/2)
since the loop increments by 2 each time, resulting in looping through half of the array size in the worst case. However, this simplifies to O(n)
because constant factors are dropped in Big O notation.
The space complexity of the code is O(1)
because it uses a fixed amount of additional space (variables s
, ans
, and n
) that doesn't scale with the size of the input array nums
.
Learn more about how to find time and space complexity quickly using problem constraints.
Is the following code DFS or BFS?
void search(Node root) { if (!root) return; visit(root); root.visited = true; for (Node node in root.adjacent) { if (!node.visited) { search(node); } } }
Recommended Readings
LeetCode Patterns Your Personal Dijkstra's Algorithm to Landing Your Dream Job The goal of AlgoMonster is to help you get a job in the shortest amount of time possible in a data driven way We compiled datasets of tech interview problems and broke them down by patterns This way we
Recursion Recursion is one of the most important concepts in computer science Simply speaking recursion is the process of a function calling itself Using a real life analogy imagine a scenario where you invite your friends to lunch https algomonster s3 us east 2 amazonaws com recursion jpg You first
Runtime Overview When learning about algorithms and data structures you'll frequently encounter the term time complexity This concept is fundamental in computer science and offers insights into how long an algorithm takes to complete given a certain input size What is Time Complexity Time complexity represents the amount of time
Want a Structured Path to Master System Design Too? Don’t Miss This!