LeetCode: 496. Next Greater Element I
You are given two arrays (without duplicates) nums1 and nums2 where
nums1’s elements are subset of nums2. Find all the next greater
numbers for nums1’s elements in the corresponding places of nums2.The Next Greater Number of a number x in nums1 is the first greater
number to its right in nums2. If it does not exist, output -1 for this
number.Example 1: Input: nums1 = [4,1,2], nums2 = [1,3,4,2]. Output:
[-1,3,-1] Explanation:
For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1.
For number 1 in the first array, the next greater number for it in the second array is 3.
For number 2 in the first array, there is no next greater number for it in the second array, so output -1. Example 2: Input: nums1 =
[2,4], nums2 = [1,2,3,4]. Output: [3,-1] Explanation:
For number 2 in the first array, the next greater number for it in the second array is 3.
For number 4 in the first array, there is no next greater number for it in the second array, so output -1. Note: All elements in nums1
and nums2 are unique. The length of both nums1 and nums2 would not
exceed 1000.
自己的答案:
public class Solution {
public int[] nextGreaterElement(int[] findNums, int[] nums) {
if (findNums.length <= 0) {
return new int[0];
}
if (nums.length <= 0) {
int[] result = new int[findNums.length];
for (int i = 0; i < result.length; i++) {
result[i] = -1;
}
return result;
}
int min = nums[0];
int max = nums[0];
for (int i = 0; i < nums.length; i++) {
if (nums[i] > max) {
max = nums[i];
}
if (nums[i] < min) {
min = nums[i];
}
}
int length = max - min + 1;
int[] temp = new int[length];
for (int i = 0; i < temp.length; i++) {
temp[i] = -1;
}
for (int i = 0; i < nums.length; i++) {
temp[nums[i] - min] = i;
}
int[] result = new int[findNums.length];
for (int i = 0; i < result.length; i++) {
result[i] = -1;
}
LOOP: for (int i = 0; i < findNums.length; i++) {
if (findNums[i] < min || findNums[i] > max) {
result[i] = -1;
continue;
}
int pos = temp[findNums[i] - min];
if (pos < 0) {
result[i] = -1;
continue;
}
for (int j = pos; j < nums.length; j++) {
if (nums[j] > findNums[i]) {
result[i] = nums[j];
continue LOOP;
}
}
}
return result;
}
}
最快的答案:
public class Solution {
public int[] nextGreaterElement(int[] findNums, int[] nums) {
if (findNums.length == 0) {
return new int[]{};
}
int numMax = -1;
for (int num : nums) {
if (num > numMax) {
numMax = num;
}
}
int[] map = new int[numMax + 1];
for (int i = 0; i < nums.length; i++) {
map[nums[i]] = i;
}
int[] result = new int[findNums.length];
for (int i = 0; i < findNums.length; i++) {
int currentNum = findNums[i];
if (currentNum > numMax) {
result[i] = -1;
} else {
int currentIndex = map[currentNum] + 1;
while (currentIndex < nums.length) {
if (nums[currentIndex] > currentNum) {
result[i] = nums[currentIndex];
break;
}
currentIndex++;
}
if (currentIndex == nums.length) {
result[i] = -1;
}
}
}
return result;
}
}
投票最高的答案:
public int[] nextGreaterElement(int[] findNums, int[] nums) {
Map<Integer, Integer> map = new HashMap<>(); // map from x to next greater element of x
Stack<Integer> stack = new Stack<>();
for (int num : nums) {
while (!stack.isEmpty() && stack.peek() < num)
map.put(stack.pop(), num);
stack.push(num);
}
for (int i = 0; i < findNums.length; i++)
findNums[i] = map.getOrDefault(findNums[i], -1);
return findNums;
}