[][src]Function leetcode_for_rust::cd0239_sliding_window_maximum::max_sliding_window

pub fn max_sliding_window(nums: Vec<i32>, k: i32) -> Vec<i32>

Solutions

Approach 1: Deque

  • Time complexity: O(n)

  • Space complexity: O(k)

use std::collections::VecDeque;

pub fn max_sliding_window(nums: Vec<i32>, k: i32) -> Vec<i32> {
    let mut deque = VecDeque::new();
    let mut result = vec![];
    let mut start = 0;
    let k = k as usize;

    for index in 0..nums.len() as usize {
        while !deque.get(start).is_none() && nums[*deque.back().unwrap()] < nums[index] {
            deque.pop_back();
        }

        deque.push_back(index);

        if index >= k && *deque.get(start).unwrap() == (index - k) {
            start += 1;
        }

        if index >= k - 1 {
            result.push(nums[*deque.get(start).unwrap()]);
        }
    }

    result
}

Approach 2: Deque

  • Time complexity: O(n)

  • Space complexity: O(k)

use std::collections::VecDeque;

pub fn max_sliding_window(nums: Vec<i32>, k: i32) -> Vec<i32> {
    let mut window = VecDeque::new();
    let mut result = vec![];
    let k = k as usize;

    for i in 0..nums.len() {
        if i > k && window[0] <= i - k {
            window.pop_front();
        }

        while !window.is_empty() && nums[*window.back().unwrap()] <= nums[i] {
            window.pop_back();
        }

        window.push_back(i);

        if i >= k - 1 {
            result.push(nums[*window.front().unwrap()]);
        }
    }
    result
}