Suppose we have a list of numbers called nums and a value k. First we shall remove a sublist of size k, then find the minimum of (maximum of nums - minimum of nums).
So, if the input is like nums = [2, 3, 10, 9, 8, 4] k = 3, then the output will be 2, If we remove [10, 9, 8] we get [2, 3, 4] and 4 - 2 = 2
To solve this, we will follow these steps −
N := size of nums
copy nums into lmin and lmax
also copy nums into rmin and rmax
for i in range 1 to N - 1, do
lmin[i] := minimum of lmin[i] and lmin[i - 1]
lmax[i] := maximum of lmax[i] and lmax[i - 1]
for i in range N - 2 to 0, decrease by 1, do
rmin[i] := minimum of rmin[i] and rmin[i + 1]
rmax[i] := maximum of rmax[i] and rmax[i + 1]
ans := minimum of (rmax[k] - rmin[k]), (lmax[complement of k] - lmin[complement of k])
for i in range 0 to N - k - 2, do
cand := (maximum of lmax[i] and rmax[i + k + 1]) - (minimum of lmin[i] and rmin[i + k + 1])
ans := minimum of ans and cand
return ans
Example
Let us see the following implementation to get better understanding
def solve(nums, k): N = len(nums) lmin, lmax = nums[:], nums[:] rmin, rmax = nums[:], nums[:] for i in range(1, N): lmin[i] = min(lmin[i], lmin[i - 1]) lmax[i] = max(lmax[i], lmax[i - 1]) for i in range(N - 2, -1, -1): rmin[i] = min(rmin[i], rmin[i + 1]) rmax[i] = max(rmax[i], rmax[i + 1]) ans = min(rmax[k] - rmin[k], lmax[~k] - lmin[~k]) for i in range(N - k - 1): cand = max(lmax[i], rmax[i + k + 1]) - min(lmin[i], rmin[i + k + 1]) ans = min(ans, cand) return ans nums = [2, 3, 10, 9, 8, 4] k = 3 print(solve(nums, k))
Input
[2, 3, 10, 9, 8, 4], 3
Output
2