def findMin(arr):
# Stores the length of the maximum size subarray
max_range = 0
# Traverse the array and consider each element as a starting point of a subarray
for i in range(len(arr)):
'''
Subarray invariant: max < 2×min
'''
# To keep track of the minimum and the maximum elements in a subarray
min_arr = max_arr = arr[i]
# Find the maximum size subarray `arr[i…j]` that satisfies
# the above invariant
for j in range(i, len(arr)):
# Find the minimum and the maximum elements in the current subarray.
# We must do this in constant time.
min_arr = min(min_arr, arr[j])
max_arr = max(max_arr, arr[j])
# Discard the subarray if the invariant is violated
if 2 * min_arr <= max_arr:
break
# Update `max_range` when a bigger subarray is found
max_range = max(max_range, j - i + 1)
# Return array size - length of the maximum size subarray
return len(arr) - max_range
if __name__ == '__main__':
arr = [4, 6, 1, 7, 5, 9, 2]
print("The minimum number of removals is", findMin(arr))
ZGVmIGZpbmRNaW4oYXJyKToKIAogICAgIyBTdG9yZXMgdGhlIGxlbmd0aCBvZiB0aGUgbWF4aW11bSBzaXplIHN1YmFycmF5CiAgICBtYXhfcmFuZ2UgPSAwCiAKICAgICMgVHJhdmVyc2UgdGhlIGFycmF5IGFuZCBjb25zaWRlciBlYWNoIGVsZW1lbnQgYXMgYSBzdGFydGluZyBwb2ludCBvZiBhIHN1YmFycmF5CiAgICBmb3IgaSBpbiByYW5nZShsZW4oYXJyKSk6CiAKICAgICAgICAnJycKICAgICAgICAgICAgU3ViYXJyYXkgaW52YXJpYW50OiBtYXggPCAyw5dtaW4KICAgICAgICAnJycKIAogICAgICAgICMgVG8ga2VlcCB0cmFjayBvZiB0aGUgbWluaW11bSBhbmQgdGhlIG1heGltdW0gZWxlbWVudHMgaW4gYSBzdWJhcnJheQogICAgICAgIG1pbl9hcnIgPSBtYXhfYXJyID0gYXJyW2ldCiAKICAgICAgICAjIEZpbmQgdGhlIG1heGltdW0gc2l6ZSBzdWJhcnJheSBgYXJyW2nigKZqXWAgdGhhdCBzYXRpc2ZpZXMKICAgICAgICAjIHRoZSBhYm92ZSBpbnZhcmlhbnQKICAgICAgICBmb3IgaiBpbiByYW5nZShpLCBsZW4oYXJyKSk6CiAKICAgICAgICAgICAgIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCB0aGUgbWF4aW11bSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBzdWJhcnJheS4KICAgICAgICAgICAgIyBXZSBtdXN0IGRvIHRoaXMgaW4gY29uc3RhbnQgdGltZS4KICAgICAgICAgICAgbWluX2FyciA9IG1pbihtaW5fYXJyLCBhcnJbal0pCiAgICAgICAgICAgIG1heF9hcnIgPSBtYXgobWF4X2FyciwgYXJyW2pdKQogCiAgICAgICAgICAgICMgRGlzY2FyZCB0aGUgc3ViYXJyYXkgaWYgdGhlIGludmFyaWFudCBpcyB2aW9sYXRlZAogICAgICAgICAgICBpZiAyICogbWluX2FyciA8PSBtYXhfYXJyOgogICAgICAgICAgICAgICAgYnJlYWsKIAogICAgICAgICAgICAjIFVwZGF0ZSBgbWF4X3JhbmdlYCB3aGVuIGEgYmlnZ2VyIHN1YmFycmF5IGlzIGZvdW5kCiAgICAgICAgICAgIG1heF9yYW5nZSA9IG1heChtYXhfcmFuZ2UsIGogLSBpICsgMSkKIAogICAgIyBSZXR1cm4gYXJyYXkgc2l6ZSAtIGxlbmd0aCBvZiB0aGUgbWF4aW11bSBzaXplIHN1YmFycmF5CiAgICByZXR1cm4gbGVuKGFycikgLSBtYXhfcmFuZ2UKIAogCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAKICAgIGFyciA9IFs0LCA2LCAxLCA3LCA1LCA5LCAyXQogICAgcHJpbnQoIlRoZSBtaW5pbXVtIG51bWJlciBvZiByZW1vdmFscyBpcyIsIGZpbmRNaW4oYXJyKSk=