[][src]Function leetcode_for_rust::cd0496_next_greater_element_i::next_greater_element

pub fn next_greater_element(nums1: Vec<i32>, nums2: Vec<i32>) -> Vec<i32>

Solutions

Approach 1: HashMap

  • Time complexity: O(n)

  • Space complexity: O(n)

  • Runtime: 0ms

Memory: 2.4MB

use std::collections::HashMap;

impl Solution {
    pub fn next_greater_element(nums1: Vec<i32>, nums2: Vec<i32>) -> Vec<i32> {
        let mut stack = vec![-1; nums1.len()];
        let mut nums_map: HashMap<&i32, usize> = HashMap::new();

        for (i, num) in nums2.iter().enumerate() {
            nums_map.insert(num, i);
        }

        for (i, num) in nums1.iter().enumerate() {
            for j in *nums_map.get(num).unwrap()..nums2.len() {
                if nums2[j] > *num {
                    stack[i] = nums2[j];
                    break;
                }
            }
        }
        stack
    }
}

Approach 2: Stack

  • Time complexity: O(n)

  • Space complexity: O(n)

  • Runtime: 0ms

Memory: 2.6MB

use std::collections::HashMap;

impl Solution {
    pub fn next_greater_element(nums1: Vec<i32>, nums2: Vec<i32>) -> Vec<i32> {
        let mut nums_map: HashMap<&i32, usize> = HashMap::new();
        let mut stack = vec![];
        let mut result = vec![-1; nums1.len()];

        for (i, num) in nums1.iter().enumerate() {
            nums_map.insert(num, i);
        }

        for num in nums2.into_iter() {
            while !stack.is_empty() && *stack.last().unwrap() < num {
                if let Some(val) = nums_map.get(&stack.pop().unwrap()) {
                    result[*val] = num;
                }
            }
            stack.push(num);
        }
        result
    }
}