fork download
  1. def findMin(arr):
  2.  
  3. # Stores the length of the maximum size subarray
  4. max_range = 0
  5.  
  6. # Traverse the array and consider each element as a starting point of a subarray
  7. for i in range(len(arr)):
  8.  
  9. '''
  10. Subarray invariant: max < 2×min
  11. '''
  12.  
  13. # To keep track of the minimum and the maximum elements in a subarray
  14. min_arr = max_arr = arr[i]
  15.  
  16. # Find the maximum size subarray `arr[i…j]` that satisfies
  17. # the above invariant
  18. for j in range(i, len(arr)):
  19.  
  20. # Find the minimum and the maximum elements in the current subarray.
  21. # We must do this in constant time.
  22. min_arr = min(min_arr, arr[j])
  23. max_arr = max(max_arr, arr[j])
  24.  
  25. # Discard the subarray if the invariant is violated
  26. if 2 * min_arr <= max_arr:
  27. break
  28.  
  29. # Update `max_range` when a bigger subarray is found
  30. max_range = max(max_range, j - i + 1)
  31.  
  32. # Return array size - length of the maximum size subarray
  33. return len(arr) - max_range
  34.  
  35.  
  36. if __name__ == '__main__':
  37.  
  38. arr = [4, 6, 1, 7, 5, 9, 2]
  39. print("The minimum number of removals is", findMin(arr))
Success #stdin #stdout 0.05s 63052KB
stdin
Standard input is empty
stdout
('The minimum number of removals is', 4)