下一個更大的元素
阿新 • • 發佈:2018-09-23
依次 http str ash 過程 要去 示例 因此 while
畫個圖具體分析過程:
給定兩個沒有重復元素的數組 nums1
和 nums2
,其中nums1
是 nums2
的子集。找到 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。
註意:
nums1
和nums2
中所有元素是唯一的。nums1
和nums2
的數組大小都不超過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
下一個更大的元素