下一個更大元素 II(LeetCode 503)

題目

給定一個循環(huán)數(shù)組(最后一個元素的下一個元素是數(shù)組的第一個元素),輸出每個元素的下一個更大元素。數(shù)字 x 的下一個更大的元素是按數(shù)組遍歷順序,這個數(shù)字之后的第一個比它更大的數(shù),這意味著你應該循環(huán)地搜索它的下一個更大的數(shù)。如果不存在,則輸出 -1。

示例 1:

輸入: [1,2,1]
輸出: [2,-1,2]
解釋: 第一個 1 的下一個更大的數(shù)是 2;
數(shù)字 2 找不到下一個更大的數(shù);
第二個 1 的下一個最大的數(shù)需要循環(huán)搜索,結果也是 2。

注意: 輸入數(shù)組的長度不會超過 10000。

題解

題解一:

  • 使用雙重循環(huán)
  • 第二層循環(huán)從j = 1開始,每次?。╥+j)%nums[nums.Length]
  • 時間復雜度為O(n2),空間復雜度為O(n)
  • 代碼
 public int[] NextGreaterElements(int[] nums) {
            int len = nums.Length;
            int[] res = new int[len];
            for (int i = 0; i < len; i++)
            {
                res[i] = -1;
                for (int j = 1; j < len; j++)
                {
                    if (nums[(j+i) % len] > nums[i])
                    {
                        res[i] = nums[(j+i) % len];
                        Console.WriteLine(res[i]);
                        break;
                    } 
                }
            }

            return res;
    }

題解二:

  • 使用單調棧
  • 假設存在一個[1,2,1,1,2,1]改造數(shù)組,這樣一次循環(huán)的數(shù)組
  • 維持一個Stack記錄元素的index,Stack中的index對應的元素單調遞減,
  • 從改造數(shù)組的最后一個元素向前掃描
  • while當前元素比Stack的頂部元素大or Stack為空:
    Stack.Pop
    Stack為空?當前元素的結果是-1:Stack.Peek
  • 時間復雜度O(n),空間復雜度O(n)
  • 代碼
    public int[] NextGreaterElements(int[] nums) {
  int len = nums.Length;
            int[] res = new int[len];
            Stack<int> stack = new Stack<int>();
            for (int i = len*2-1; i >= 0; --i)
            {
                while (stack.Count>0&& nums[stack.Peek()]<=nums[i%len])
                {
                    stack.Pop();
                }
                res[i % len] = stack.Count > 0 ? nums[stack.Peek()] : -1;
                stack.Push(i % len );
            }
            return res;
    }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容