The goal is to determine the minimum number of merge operations required to make an array a palindrome.
This method uses a two-pointer technique to check and merge elements as needed.
def min_operations(arr): i, j = 0, len(arr) - 1 operations = 0 while i < j: if arr[i] == arr[j]: i += 1 j -= 1 elif arr[i] < arr[j]: arr[i + 1] += arr[i] i += 1 operations += 1 else: arr[j - 1] += arr[j] j -= 1 operations += 1 return operations arr = [1, 4, 5, 1] print("Minimum operations:", min_operations(arr))
Minimum operations: 1
This method uses a recursive approach to count the operations.
def min_ops_recursive(arr, i, j): if i >= j: return 0 if arr[i] == arr[j]: return min_ops_recursive(arr, i + 1, j - 1) if arr[i] < arr[j]: arr[i + 1] += arr[i] return 1 + min_ops_recursive(arr, i + 1, j) else: arr[j - 1] += arr[j] return 1 + min_ops_recursive(arr, i, j - 1) arr = [1, 4, 5, 1] print("Minimum operations:", min_ops_recursive(arr, 0, len(arr) - 1))
Minimum operations: 1
This method utilizes a DP table to compute the minimum operations.
def min_ops_dp(arr): n = len(arr) dp = [[0] * n for _ in range(n)] for gap in range(1, n): for i in range(n - gap): j = i + gap if arr[i] == arr[j]: dp[i][j] = dp[i + 1][j - 1] else: dp[i][j] = 1 + min(dp[i + 1][j], dp[i][j - 1]) return dp[0][n - 1] arr = [1, 4, 5, 1] print("Minimum operations:", min_ops_dp(arr))
Minimum operations: 1