[][src]Struct leetcode_for_rust::cd0641_design_circular_deque::MyCircularDeque

pub struct MyCircularDeque { /* fields omitted */ }

Solutions

Approach 1:

  • Time complexity: O(1)

  • Space complexity: O(n)

  • Runtime: 8 ms

  • Memory: 2.8 MB

struct MyCircularDeque {
    items: Vec<Option<i32>>,
    head: i32,
    tail: i32,
    capacity: i32,
    size: i32,
}


/**
 * `&self` means the method takes an immutable reference.
 * If you need a mutable reference, change it to `&mut self` instead.
 */
impl MyCircularDeque {

    /** Initialize your data structure here. Set the size of the deque to be k. */
    fn new(k: i32) -> Self {
        MyCircularDeque {
            items: vec![None; k as usize],
            head: 0,
            tail: -1,
            capacity: k,
            size: 0,
        }

    }

    /** Adds an item at the front of Deque. Return true if the operation is successful. */
    fn insert_front(&mut self, value: i32) -> bool {
        if self.is_full() { return false; }

        self.head = self.get_curr_position(self.head);
        self.items[self.head as usize] = Some(value);
        self.size += 1;

        if self.size == 1 { self.tail = self.head; }

        true
    }

    /** Adds an item at the rear of Deque. Return true if the operation is successful. */
    fn insert_last(&mut self, value: i32) -> bool {
        if self.is_full() { return false; }

        self.tail = (self.tail + 1) % self.capacity;
        self.items[self.tail as usize] = Some(value);
        self.size += 1;

        true
    }

    /** Deletes an item from the front of Deque. Return true if the operation is successful. */
    fn delete_front(&mut self) -> bool {
        if self.is_empty() { return false; }

        self.items[self.head as usize] = None;
        self.head = (self.head + 1) % self.capacity;
        self.size -= 1;

        true
    }

    /** Deletes an item from the rear of Deque. Return true if the operation is successful. */
    fn delete_last(&mut self) -> bool {
        if self.is_empty() { return false; }

        self.items[self.tail as usize] = None;
        self.tail = self.get_curr_position(self.tail);
        self.size -= 1;

        true
    }

    /** Get the front item from the deque. */
    fn get_front(&self) -> i32 {
        self.items[self.head as usize].unwrap_or(-1)
    }

    /** Get the last item from the deque. */
    fn get_rear(&self) -> i32 {
        self.items[self.tail as usize].unwrap_or(-1)
    }

    /** Checks whether the circular deque is empty or not. */
    fn is_empty(&self) -> bool {
        self.size == 0
    }

    /** Checks whether the circular deque is full or not. */
    fn is_full(&self) -> bool {
        self.size == self.capacity
    }

    fn get_curr_position(&self, p: i32) -> i32 {
        if p == 0 { self.capacity - 1 } else { (p - 1) % self.capacity }
    }
}
/**
 * Your MyCircularDeque object will be instantiated and called as such:
 * let obj = MyCircularDeque::new(k);
 * let ret_1: bool = obj.insert_front(value);
 * let ret_2: bool = obj.insert_last(value);
 * let ret_3: bool = obj.delete_front();
 * let ret_4: bool = obj.delete_last();
 * let ret_5: i32 = obj.get_front();
 * let ret_6: i32 = obj.get_rear();
 * let ret_7: bool = obj.is_empty();
 * let ret_8: bool = obj.is_full();
 */

Auto Trait Implementations

Blanket Implementations

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> From<T> for T[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]