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<arr.length;j++){
            System.out.print(arr[j]+"    ");}*/

    }
    static public int[] nextGreaterElement(int[] nums1, int[] nums2) {

        if(nums2==null || nums2.length==0)return new int[]{};//如果数组2为空,则返回一个空数组
        Map<Integer,Integer> map=new HashMap<>();// map from x to next greater element of x
        Stack<Integer> stack = new Stack<>();
        for(int num:nums2){

        //1. 栈不为空 
        //2. 栈顶元素,小于当前的nums2的元素
            while(!stack.isEmpty()&&stack.peek()<num)  //peek()方法的源码会发现只是把数组 
        //的最后一个元素(就是栈顶)返回来了,而没有做删除。

                //map.put(栈顶元素,num)
                //可能会生成很多个不同的key对应同一个value
                map.put(stack.pop(),num);//满足条件的生生map表
            stack.push(num);////把元素num压栈  不满足的情况就压栈
        }

        int[] res=new int[nums1.length];
        for(int i = 0;i<nums1.length;i++){

     //判断map里面是否有nums1的key,没有值则赋value为-1,有则不改变,最终并返回value
            res[i]=map.getOrDefault(nums1[i],-1);
        }
        return res;
    }
}

 代码解读:

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()<num)  //peek()方法的源码会发现只是把数组 
        //的最后一个元素(就是栈顶)返回来了,而没有做删除。

                //map.put(栈顶元素,num)
                //可能会生成很多个不同的key对应同一个value
                map.put(stack.pop(),num);//满足条件的生生map表
            stack.push(num);////把元素num压栈  不满足的情况就压栈
        }

 代码解释用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<num=3.故执行map.put(stack.pop(),num)语句

执行完后,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

 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<nums1.length;i++){

            //判断map里面是否有nums1的key,没有值则赋value为-1,有则不改变,最终并返回value
            res[i]=map.getOrDefault(nums1[i],-1);
        }

return res;

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));

猜你喜欢

转载自blog.csdn.net/nsjlive/article/details/82563881