```ts
export function maxSlidingWindow(nums: number[], k: number): number[] {
  if (!Number.isInteger(k) || k < 1 || k > nums.length) {
    throw new Error("k must be an integer between 1 and the array length");
  }

  if (nums.length === 0) {
    return [];
  }

  const result: number[] = [];
  const deque: number[] = []; // stores indices

  // Initialize the deque for the first window
  for (let i = 0; i < k; i++) {
    while (deque.length > 0 && nums[i] >= nums[deque[deque.length - 1]]) {
      deque.pop();
    }
    deque.push(i);
  }
  result.push(nums[deque[0]]);

  // Process remaining windows
  for (let i = k; i < nums.length; i++) {
    // Remove indices that are out of the current window
    while (deque.length > 0 && deque[0] <= i - k) {
      deque.shift();
    }

    // Remove indices whose values are less than current element
    while (deque.length > 0 && nums[i] >= nums[deque[deque.length - 1]]) {
      deque.pop();
    }

    deque.push(i);
    result.push(nums[deque[0]]);
  }

  return result;
}
```