题目大意
给定两个没有重复元素的数组 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。
代码一
暴力法,写一个indexOf方法,找nums1[i]在nums2中的哪个下标位置。
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
if(nums1.length > nums2.length) return new int[]{};
int[] res = new int[nums1.length];
for(int i = 0;i<res.length;i++) //初始化
res[i] = -1;
for(int i = 0;i<nums1.length;i++) {
int index = findIndexOf(nums1[i],nums2); //nums2中相同元素的index
for(int j=index+1;j<nums2.length;j++)
if(nums2[j] > nums1[i]) {
res[i] = nums2[j];
break;
}
}
return res;
}
private int findIndexOf(int target, int[] nums) {
//在nums中找target的下标
for(int i=0;i<nums.length;i++)
if(target == nums[i]) return i;
return -1;
}
运行时间2ms,击败98.43%。
代码二
利用栈存储每个nums2[i]的下一个大元素。
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
if(nums1.length ==0 || nums1.length > nums2.length) return new int[]{};
Stack<Integer> stack = new Stack<>(); // nums2[i]
Map<Integer,Integer> map = new HashMap<>(); //nums2[i]:nums2[j]
int[] res = new int[nums1.length];
int k = 0;
stack.push(nums2[k++]);
while(k<nums2.length)
{
if(stack.isEmpty()) { //栈空
stack.push(nums2[k++]);
} else {
int tmp = stack.peek();
if(nums2[k] > tmp) {
map.put(tmp,nums2[k]);
stack.pop();
} else {
stack.push(nums2[k++]);
}
}
}
for(int i=0;i<nums1.length;i++)
res[i] = map.getOrDefault(nums1[i],-1);
return res;
}
运行时间5ms,击败69.71%。