LeetCode演算法題-Next Greater Element I(Java實現)
這是悅樂書的第244次更新,第257篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第111題(順位題號是496)。你有兩個陣列(沒有重複)nums1和nums2,其中nums1的元素是nums2的子集。在nums2的相應位置找到nums1元素的所有下一個更大的數字。nums1中的數字x的下一個更大數字是nums2中右邊第一個更大的數字。如果它不存在,則輸出該數字的-1。例如:
輸入:nums1 = [4,1,2],nums2 = [1,3,4,2]。
輸出:[-1,3,-1]
說明:對於第一個陣列中的數字4,在第二個陣列中找不到下一個更大的數字,因此輸出-1。對於第一個陣列中的數字1,第二個陣列中的下一個更大數字是3。對於第一個陣列中的數字2,第二個陣列中沒有下一個更大的數字,因此輸出-1。
輸入:nums1 = [2,4],nums2 = [1,2,3,4]。
輸出:[3,-1]
說明:對於第一個陣列中的數字2,第二個陣列中的下一個更大數字是3。對於第一個陣列中的數字4,第二個陣列中沒有下一個更大的數字,因此輸出-1。
注意:
nums1和nums2中的所有元素都是唯一的。
nums1和nums2的長度不會超過1000。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
暴力解法。使用兩層迴圈,先找到nums1的元素在nums2中的對應元素,然後從nums2中找到的元素的下一位往右開始判斷,找到比當前元素大的元素,找得到就將其作為結果陣列的元素新增進去,否則就將-1新增進結果陣列。
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
for (int i=0; i<nums1.length; i++) {
int j = 0, k = 0;
for (; j<nums2.length; j++) {
if (nums1[i] == nums2[j]) {
break;
}
}
for (k = j+1; k<nums2.length; k++) {
if (nums2[k] > nums2[j]) {
result[i] = nums2[k];
break;
}
}
if (k == nums2.length) {
result[i] = -1;
}
}
return result;
}
03 第二種解法
我們可以將第一種方法進行優化,將nums2中的元素作為key、索引作為value存入HashMap,在原來第一種解法中每次通過迴圈來定位nums2中的索引位置,換成了通過key查詢value的對映,獲取到索引後,從索引後一位開始依次尋找比nums1的當前元素大的數字,找得到就替換已經設值為-1的結果陣列的元素值。
public int[] nextGreaterElement2(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i<nums2.length; i++) {
map.put(nums2[i], i);
}
for (int j=0; j<nums1.length; j++) {
result[j] = -1;
int index = map.get(nums1[j]);
for (int k = index + 1; k<nums2.length; k++) {
if (nums2[k] > nums1[j]) {
result[j] = nums2[k];
break;
}
}
}
return result;
}
04 第三種解法
使用HashMap和棧。在第二種解法中我們使用HashMap存的是nums2的值、索引,在此解法中,我們使用HashMap存的是,如果nums2的當前元素存在右邊最大數,上一個元素為key,當前元素為value。
在遍歷nums2中的元素時,如果棧不為空,並且當前棧頂的值小於當前元素,即nums2的前一個元素存在右邊最大數,此時,我們需要將棧頂的元素作為key,當前元素作為value,存入HashMap中,同時,要將棧頂的元素移除,此操作是迴圈執行的。最後我們再將nums2的當前元素存入stack中。
接著,我們要開始處理nums1的資料了,遍歷其中的元素,如果能夠在HashMap中找到對應的值,就取其value作為結果陣列的元素值,否則取-1作為預設值。
public int[] nextGreaterElement3(int[] nums1, int[] nums2) {
int[] result = new int[nums1.length];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Stack<Integer> stack = new Stack<Integer>();
for (int num : nums2) {
while (!stack.isEmpty() && stack.peek() < num) {
map.put(stack.pop(), num);
}
stack.push(num);
}
for (int i=0; i<nums1.length; i++) {
result[i] = map.getOrDefault(nums1[i], -1);
}
return result;
}
05 小結
演算法專題目前已日更超過三個月,演算法題文章111+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!
相關文章
- [Leetcode學習-c++&java]Next Greater Element I ~ IIILeetCodeC++Java
- LeetCode演算法題-Number of Boomerangs(Java實現)LeetCode演算法OOMJava
- LeetCode 之 JavaScript 解答第169題 —— 求眾數 I(Majority Element)LeetCodeJavaScript
- LeetCode之Convert BST to Greater Tree(Kotlin)LeetCodeKotlin
- [LeetCode] 2275. Largest Combination With Bitwise AND Greater Than ZeroLeetCode
- [2]十道演算法題【Java實現】演算法Java
- LeetCode題目:39. 組合總和 解題思路及Java實現LeetCodeJava
- Leetcode 31 Next PermutationLeetCode
- LeetCode演算法題LeetCode演算法
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- [leetcode]remove-elementLeetCodeREM
- 【雜談】Java I/O的底層實現Java
- leetcode 455題 javaLeetCodeJava
- 排序演算法Java實現排序演算法Java
- KMP演算法 Java實現KMP演算法Java
- 排序演算法 Java實現排序演算法Java
- Java實現 LeetCode 35 搜尋插入位置JavaLeetCode
- leetcode演算法題解(Java版)-3-廣搜+HashMapLeetCode演算法JavaHashMap
- LeetCode146 動手實現LRU演算法LeetCode演算法
- leetcode演算法題解(Java版)-14-第k小數問題LeetCode演算法Java
- 蟻群演算法java實現以及TSP問題蟻群演算法求解演算法Java
- leetcode-27. Remove ElementLeetCodeREM
- Leetcode 27 Remove-ElementLeetCodeREM
- LeetCode Kth Largest Element in an ArrayLeetCode
- LeetCode 169. Majority ElementLeetCode
- [LeetCode] 681. Next Closest TimeLeetCode
- leetcode253——會議室 II——java實現LeetCodeJava
- LeetCode 299 猜數字遊戲 Java實現LeetCode遊戲Java
- leetcode演算法題解(Java版)-12-中序遍歷LeetCode演算法Java
- leetcode排序專題演算法刷題LeetCode排序演算法
- 【LeetCode回溯演算法#07】子集問題I+II,鞏固解題模板並詳解回溯演算法中的去重問題LeetCode演算法
- [LeetCode] 1343. Number of Sub-arrays of Size K and Average Greater than or Equal to ThresholdLeetCode
- LeetCode第三題之二:編碼實現LeetCode
- 排序演算法-Java實現快速排序演算法排序演算法Java
- leetcode演算法題解(Java版)-7-迴圈連結串列LeetCode演算法Java
- Java實現AES和RSA演算法Java演算法
- Java Stream API:實現 Kruskal 演算法JavaAPI演算法
- Java中Blowfish加密演算法實現Java加密演算法