zoukankan      html  css  js  c++  java
  • leetcode496——Next Greater Element I (JAVA)

    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:

      1. All elements in nums1 and nums2 are unique.
      2. The length of both nums1 and nums2 would not exceed 1000.

    我用两种方法解决这个问题。转载注明出处:http://www.cnblogs.com/wdfwolf3/,谢谢。

    1.时间复杂度O(m*n),8ms。思路很简单,对于每个子集合元素去遍历父集合,查找大于它的第一个元素。

    public int[] nextGreaterElement(int[] findNums, int[] nums) {
            //ans数组存放结果
            int[] ans = new int[findNums.length];
            //便利数组findNums中的元素
            for (int i = 0; i < findNums.length; i++) {
                int start = 0;
                //start索引从头开始遍历nums查找当前元素在nums中的位置
                while (findNums[i] != nums[start]){
                    start++;
                }
                //从start位置开始向后查找第一个比当前元素大的值,并赋值到ans数组中
                for (; start < nums.length; start++) {
                    if(nums[start] > findNums[i]){
                        ans[i] = nums[start];
                        break;
                    }
                }
                //如果start到达nums末尾,说明没有找到大于当前元素的值,赋值-1到ans数组中
                if(start == nums.length){
                    ans[i] = -1;
                }
            }
            return ans;
        }

    2.时间复杂度O(m*n),空间复杂度O(n),11ms。利用一个栈来查找父集合中每个元素的Next Greater Element,找到了就存放到HashMap中,最后遍历子集合,如果HashMap中没有说明不存在,赋值-1。

    public int[] nextGreaterElement(int[] findNums, int[] nums) {
            //辅助栈,存放待查找结果的元素,查找到的立即出栈
            Stack<Integer> stack = new Stack<>();
            //key存放元素,value存放找到的第一个大于它的值
            Map<Integer, Integer> map = new HashMap<>();
            //当栈顶元素大于当前元素时,入栈;当栈顶元素小于当前元素时,说明栈顶元素找到了第一个大于的值,出栈,然后继续出栈直到栈顶元素大于当前元素,将当前元素入栈。
            for (int i = 0; i < nums.length; i++) {
                while(!stack.isEmpty() && stack.peek() < nums[i]){
                    map.put(stack.pop(), nums[i]);
                }
                stack.push(nums[i]);
            }
            //ans数组存放结果
            int[] ans = new int[findNums.length];
         //遍历findNums,在map中查找结果,不存在说明没有大于它的第一个元素,赋值为-1
    for (int i = 0; i < findNums.length; i++) { ans[i] = map.getOrDefault(findNums[i], -1); } return ans; }
  • 相关阅读:
    关于遇到问题的解决方法(仅此献给初学者吧,我工作还没两年,这点经验对于大神,不值一谈的)
    chm TO html 另类方法
    Android EditText setOnClickListener事件 只有获取焦点才能响应 采用setOnTouchListener解决
    Jquery UI 中Tree组件的json格式,java递归拼接demo
    汇编 二则运算
    创建 macvlan 网络
    准备 macvlan 环境
    overlay 是如何隔离的?- 每天5分钟玩转 Docker 容器技术(53)
    overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)
    在 overlay 中运行容器
  • 原文地址:https://www.cnblogs.com/wdfwolf3/p/6835566.html
Copyright © 2011-2022 走看看