题目:https://leetcode-cn.com/problems/next-greater-element-i/description/
给定两个没有重复元素的数组 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。代码如下(包含测试案例):
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class BinTree {
public static void main(String[] args) {
int[] arr1={4,1,2};
int[] arr2={1,3,4,2};
int[] arr=nextGreaterElement(arr1,arr2);
System.out.println(Arrays.toString(arr));//使用Array类中的toString方法,输出数组
/*for (int j = 0;j map=new HashMap<>();// map from x to next greater element of x
Stack stack = new Stack<>();
for(int num:nums2){
//1. 栈不为空
//2. 栈顶元素,小于当前的nums2的元素
while(!stack.isEmpty()&&stack.peek()
代码解读:
1)
if(nums2==null || nums2.length==0)return new int[]{};//如果数组2为空,则返回一个空数组
2)
for(int num:nums):
增强型for循环 , for(类型 变量:数组){System.out.println(变量);}
首先,nums是一个数组,里面放的是int类型的数据,然后定义了一个int类型的变量num,每循环一次,就从nums数组中取出一个数据来打印。
int :表示你要遍历的集合的类型
nums:表示你要遍历的集合的名
num:表示你每遍历集合中一个元素 便存储到该变量中,
然后在foreach语句的{}使用num变量;
3)
for(int num:nums2){
//1. 栈不为空
//2. 栈顶元素,小于当前的nums2的元素
while(!stack.isEmpty()&&stack.peek()
代码解释用debug说明:
1:第一次进入for循环,num从nums2中取出第一个数字1;stack中此时为空
stack.isEmpty为true, ! stack.isEmpty为false;
所以要执行stack.push(num)语句,此时stack 的size=1,value=1;
2:第二次进入for循环,num=2. stack不为空,stack.peek=1 执行完后,map.size=3, map的key为1,value为3,可以表示为map(<1,3>), 此时执行了stack.pop(),故stack里面数据为空; 3:当num=3, 执行stack.push(num)语句,此时stack 的size=1,value=3; 补充: 如何输出一个数组呢? 参考链接:https://blog.csdn.net/m0_37160376/article/details/80257700 。。。。。。 同理,当num=2,map(<1,3>,<3,4>) stack有两个元素,分别问(4,2). 4) 5) map中的key与nums1中的值进行比较,存在的话,返回相应键的值(value),没有的话,返回-1 并把这个返回值传给res数组; 注明:Map的新方法getOrDefault(Object,V)允许调用者在代码语句中规定获得在map中符合提供的键的值,否则在没有找到提供的键的匹配项的时候返回一个“默认值”。 两种方法,第二张更方便 int[] res=new int[nums1.length]; //生成一个大小为num.length=3的数组
for(int i = 0;i
(1)for循环遍历整个数组
for (int j = 0;j<10;j++){
System.out.print(b[j]+" ");
(2 )使用Array类中的toString方法
System.out.println(Arrays.toString(b));