Skip to content

Prepare For Coder Interview – Denny

  • Basic
  • Medium
  • Hard
  • Architect
  • Life

LeetCode: Sliding Window Median

Posted on March 2, 2018July 26, 2020 by braindenny

Sliding Window Median



Similar Problems:

  • Find Median from Data Stream
  • Tag: #heap, #slidingwindow, #getmedian

Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.

Examples:

[2,3,4] , the median is 3

[2,3], the median is (2 + 3) / 2 = 2.5

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position. Your job is to output the median array for each window in the original array.

For example,

Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

Window position                Median
---------------               -----
[1  3  -1] -3  5  3  6  7       1
 1 [3  -1  -3] 5  3  6  7       -1
 1  3 [-1  -3  5] 3  6  7       -1
 1  3  -1 [-3  5  3] 6  7       3
 1  3  -1  -3 [5  3  6] 7       5
 1  3  -1  -3  5 [3  6  7]      6
Therefore, return the median sliding window as [1,-1,-1,3,5,6].

Note:
You may assume k is always valid, ie: k is always smaller than input array’s size for non-empty array.

Github: code.dennyzhang.com

Credits To: leetcode.com

Leave me comments, if you have better ways to solve.


## https://code.dennyzhang.com/sliding-window-median
class Solution:
    ## Basic Ideas: two heap
    ## Complexity: Time O(n*k), Space O(k)
    def medianSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[float]
        """
        import heapq
        l1, l2 = [], []
        maxHeap = heapq.heapify(l1)
        minHeap = heapq.heapify(l2)

        res = []
        for i in range(len(nums)):
            heapq.heappush(l1, -nums[i])

            if i<k-1: continue

            # rebalancing
            while len(l1) > len(l2):
                heapq.heappush(l2, -heapq.heappop(l1))

            # collect results
            item = (-l1[0] + l2[0])/2 if k%2==0 else float(l2[0])
            res.append(item)            

            # remove item
            if self.heapRemove(l1, -nums[i-k+1]):
                # Notice: If we delete from l1, move one back from l2 to l1
                heapq.heappush(l1, -heapq.heappop(l2))
            else:
                self.heapRemove(l2, nums[i-k+1])
        return res

    def heapRemove(self, l, item):
        k = -1
        for i in range(len(l)):
            if l[i] == item:
                k = i
                break
        if k != -1:
            l[k] = l[0]
            heapq.heappop(l)
            heapq.heapify(l)
            return True
        return False

    ## Basic Ideas: insert with binary search
    ## Complexity: Time O(n*k), Space O(k)
    def medianSlidingWindow_v1(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[float]
        """
        import bisect
        res = []
        window = sorted(nums[:k])
        for a, b in zip(nums, nums[k:]+[0]):
            res.append((window[int(k/2)] + window[~int(k/2)])/2)
            window.remove(a)
            bisect.insort(window, b)
        return res
linkedin
github
slack

Post Views: 5
Posted in HardTagged #heap, #slidingwindow, getmedian, redo

Post navigation

LeetCode: Wiggle Sort II
LeetCode: Sparse Matrix Multiplication

Leave a Reply Cancel reply

Your email address will not be published.

Tags

#array #backtracking #bfs #binarytree #bitmanipulation #blog #classic #codetemplate #combination #dfs #dynamicprogramming #game #graph #greedy #heap #inspiring #interval #linkedlist #manydetails #math #palindrome #recursive #slidingwindow #stack #string #subarray #trie #twopointer #twosum binarysearch editdistance hashmap intervaldp knapsack monotone oodesign presum rectangle redo review rotatelist series sql treetraversal unionfind

Recent Posts

  • a
  • a
  • a
  • a
  • a

Recent Comments

    Archives

    Categories

    • Amusing
    • Basic
    • Easy
    • Hard
    • Life
    • Medium
    • Resource
    • Review
    • Series
    • Uncategorized
    Proudly powered by WordPress | Theme: petals by Aurorum.