1. 程式人生 > >下一個更大的元素

下一個更大的元素

依次 http str ash 過程 要去 示例 因此 while

給定兩個沒有重復元素的數組 nums1nums2 ,其中nums1nums2 的子集。找到 nums1 中每個元素在 nums2 中的下一個比其大的值。

nums1 中數字 x 的下一個更大元素是指 x 在 nums2 中對應位置的右邊的第一個比 x 大的元素。如果不存在,對應位置輸出-1。

示例 1:

輸入: nums1 = [4,1,2], nums2 = [1,3,4,2].
輸出: [-1,3,-1]
解釋:
    對於num1中的數字4,你無法在第二個數組中找到下一個更大的數字,因此輸出 -1。
    對於num1中的數字1,第二個數組中數字1右邊的下一個較大數字是 3。
    對於num1中的數字2,第二個數組中沒有下一個更大的數字,因此輸出 -1。

示例 2:

輸入: nums1 = [2,4], nums2 = [1,2,3,4].
輸出: [3,-1]
解釋:
    對於num1中的數字2,第二個數組中的下一個較大數字是3。
    對於num1中的數字4,第二個數組中沒有下一個更大的數字,因此輸出 -1。

註意:

  1. nums1nums2中所有元素是唯一的。
  2. nums1nums2 的數組大小都不超過1000。

通過此題掌握棧的用法

題目分析:

給定兩個數組,第一個數組是第二個數組的子集,說明第一個數組裏面的元素都在第二個數組裏面;依次掃描第一個數組裏面的元素,去第二個數組裏面找到第一個比此數大的數,存儲;如果沒有比此數大的數,則存儲-1;最後輸出的結果的長度一定是和第一個數組大小相等。

解決此題可以通過棧的知識和hashMap(hashMap的知識可以Google了解)的知識解決:

因為第一個數組裏面的元素一定在第二個數組裏面,所以對第二個數組進行處理;利用棧的知識,依次讓第二個數組裏面元素入棧,如果碰到要入棧的數比棧頂元素大的情況,則運用hashMap(key,value),hashMap()存儲的是一個鍵值對,我們將此時比棧頂大的數作為‘值’,此時的棧頂作為‘鍵’存儲到hashMap中,依次循環直至完成遍歷第二個數組; 為什麽要這樣存儲鍵值呢?因為,我們要得出結果,是去比較第一個數組和第二個數組裏面的元素,直至在第二個數組裏面找到比第一個數組裏面小的元素,找不到則輸出-1;那麽我們最後只需要去hashMap裏面尋找‘鍵值對’,此時的‘鍵’如若是第一個數組裏面的元素,則它對應的‘值’就是要求的結果,當然也會存在一些‘鍵值對’,它們的‘鍵’不屬於第一個數組而是屬於第二個數組;如果第一個數組裏面的元素在‘鍵值對’裏面沒有找到相等的‘鍵’,則輸出-1;
畫個圖具體分析過程:技術分享圖片 技術分享圖片

代碼實現:

 1 public int[] nextGreaterElement(int[] nums1, int[] nums2)
 2    {
 3        Stack<Integer> stack = new Stack<>();
 4        Map<Integer, Integer> map = new HashMap<>();
 5 
 6        for (int num : nums2)
 7        {
 8            //1. 棧不為空
 9            //2. 棧頂元素,小於當前的nums2的元素
10            while(!stack.isEmpty() && stack.peek()<num)
11            {
12                //map.put(棧頂元素,num)
13                //可能會生成很多個不同的key對應同一個value
14                map.put(stack.pop(),num);
15            }
16            //把元素壓棧
17            stack.push(num);
18        }
19 
20        int[] res = new int[nums1.length];
21 
22        //判斷map裏面是否有nums1的key,沒有值則賦value為-1,有則不改變,最終並返回value
23        for (int i = 0; i < nums1.length; i++)
24        {
25            res[i] = map.getOrDefault(nums1[i], -1);
26        }
27 
28        return res;
29    }

主函數:

1 public static void main(String[] args)
2     {
3         T5 t = new T5();
4         int[] a = t.nextGreaterElement(new int[]{4,1,2}, new int[]{1,3,4,2});
5         for (int i = 0; i < a.length; i++)
6         {
7             System.out.print(a[i] + " ");
8         }
9     }

運行結果:

1 -1 3 -1 

下一個更大的元素