496. 下一个更大元素 java 以及如何输出一个数组 (栈)

题目:https://leetcode-cn.com/problems/next-greater-element-i/description/

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 大的元素。如果不存在,对应位置输出-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。

注意:

  1. nums1nums2中所有元素是唯一的。
  2. nums1nums2 的数组大小都不超过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说明:

496. 下一个更大元素 java 以及如何输出一个数组 (栈)_第1张图片

1:第一次进入for循环,num从nums2中取出第一个数字1;stack中此时为空

stack.isEmpty为true,  ! stack.isEmpty为false;

所以要执行stack.push(num)语句,此时stack 的size=1,value=1;

496. 下一个更大元素 java 以及如何输出一个数组 (栈)_第2张图片 2:第二次进入for循环,num=2. stack不为空,stack.peek=1

执行完后,map.size=3, map的key为1,value为3,可以表示为map(<1,3>),

此时执行了stack.pop(),故stack里面数据为空;

496. 下一个更大元素 java 以及如何输出一个数组 (栈)_第3张图片 3:当num=3, 执行stack.push(num)语句,此时stack 的size=1,value=3;

 补充: 如何输出一个数组呢? 参考链接:https://blog.csdn.net/m0_37160376/article/details/80257700

496. 下一个更大元素 java 以及如何输出一个数组 (栈)_第4张图片 4:

。。。。。。

同理,当num=2,map(<1,3>,<3,4>)

stack有两个元素,分别问(4,2).

4)

 int[] res=new int[nums1.length]; //生成一个大小为num.length=3的数组

5)

for(int i = 0;i

map中的key与nums1中的值进行比较,存在的话,返回相应键的值(value),没有的话,返回-1 

并把这个返回值传给res数组;

注明:Map的新方法getOrDefault(Object,V)允许调用者在代码语句中规定获得在map中符合提供的键的值,否则在没有找到提供的键的匹配项的时候返回一个“默认值”。 

两种方法,第二张更方便

(1)for循环遍历整个数组

for (int j = 0;j<10;j++){
            System.out.print(b[j]+"    ");


(2 )使用Array类中的toString方法

System.out.println(Arrays.toString(b));

 

你可能感兴趣的:(java,leetcode)