1. 程式人生 > 其它 >leetcode-496. 下一個更大元素 I

leetcode-496. 下一個更大元素 I

題目

496. 下一個更大元素 I

解法

遍歷一遍 nums2 , 算出來每個元素的下一個最大元素,然後遍歷 nums1 取結果

暴力解法:

class Solution {

    /**
     * @param Integer[] $nums1
     * @param Integer[] $nums2
     * @return Integer[]
     */
    function nextGreaterElement($nums1, $nums2) {
        if (empty($nums2) || empty($nums1)) {
            return [];
        }

        $pairRet = [];
        $toPair  = [];
        foreach ($nums2 as $key => $n2) {
            foreach ($toPair as $key => $item) {
                if ($item < $n2) {
                    $pairRet[$item] = $n2;
                    unset($toPair[$key]);
                }
            }

            $toPair[] = $n2;
        }

        $ret = [];
        foreach ($nums1 as $item) {
            $ret[] = $pairRet[$item] ?: -1;
        }

        return $ret;
    }
}

單調棧

    function nextGreaterElement($nums1, $nums2) {
        if (empty($nums2) || empty($nums1)) {
            return [];
        }

        $n2Ret = [];
        $stack = [];
        foreach ($nums2 as $key => $n2) {
            if (empty($stack)) {
                $stack[] = $n2;
            } else {
				// 維護一個棧,裡面的值總是遞減的單調棧
                while (!empty($stack) && $stack[count($stack) - 1] < $n2) {
                    $n2Ret[array_pop($stack)] = $n2;
                }
                $stack[] = $n2;
            }

        }

        $ret = [];
        foreach ($nums1 as $item) {
            $ret[] = $n2Ret[$item] ?: -1;
        }

        return $ret;
    }

參考

本文來自部落格園,作者:吳丹陽-cn,轉載請註明原文連結:https://www.cnblogs.com/wudanyang/p/15758594.html