博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
找到一个数组后面第一个大的数
阅读量:4059 次
发布时间:2019-05-25

本文共 2766 字,大约阅读时间需要 9 分钟。

问题描述:

对于一个数组,找到每个数后面第一个比它大的数。如果不存在就返回-1,通过一个新数组返回1

解决方案:

使用一个栈,栈中保存数组的下标。遍历原数组,如果原数组的值比栈顶下标元素值小,直接入栈,不然的话就一直出栈,并且填写新数组栈顶下标位置为原数组当前访问值,出栈后再进行比较,如果栈中最后海油其他元素,则全部弹出,然后他们的位置填写-1。

package Array;import java.util.Stack;public class FindNextBigger {    /**     * 问题描述:找出数组中后面第一个比它小的数     * 方法:使用一个栈,压入的是元素的下标,如果比栈顶下标的元素小就入栈,不然就一直出栈,直到比栈顶下标元素小。     */     public static int[] findNextBigger(int[] arr){          if(arr == null || arr.length == 1){               return arr;          }          int[] newArr = new int[arr.length];          Stack
stack = new Stack<>(); for(int i = 0; i < arr.length; i++){ if(stack.empty() || arr[i] <= arr[stack.peek()]){ stack.push(i); }else{ while(!stack.empty() && arr[i] > arr[stack.peek()]){ newArr[stack.pop()] = arr[i]; } stack.push(i); } } while(!stack.empty()){ newArr[stack.pop()] = -1; } return newArr; } public static void main(String[] args){ int[] arr = {3,1,2,4}; int[] newArr = findNextBigger(arr); for(int i = 0; i < arr.length; i++){ System.out.print(newArr[i] + " "); } System.out.println(); }}

另一种情况:

1、假如说是一个数组nums1是另一个数组nums2的子集,求出nums1在nums2中右边第一个比它大的数

方法:也是使用一个栈,遍历nums1,然后如果栈为空,或者遍历的元素比栈顶元素小的话,就把当前访问元素入栈,注意:

和上一题不一样,上一题是把下标入栈,而这次就是把元素入栈。

然后再使用一个哈希表,如果遍历的当前元素比栈顶大,则弹出栈顶元素,并把它放到HashMap的key中,然后value部分放当前元素。这样遍历完数组nums2,HashMap中保存的就是有右边比它大的数的元素,而栈中剩下的元素都是右边没有比它大的元素。

这样的话,填写输出数组,只要访问一下HashMap表,如果HashMap中没有这个元素,那么就是-1,如果有的话就是取出HashMap对应的value,所以时间复杂度就是O(n),因为nums2数组中元素每个都会被遍历一次,每个都会入栈一次,最多出栈一次,也有可能不出栈,所以时间复杂度就是O(n).填写输出数组的时间复杂度是O(nums1.length),

空间复杂度也是O(n)

class Solution {    public int[] nextGreaterElement(int[] nums1, int[] nums2) {        if(nums1 == null){           return null;         }         Stack
stack = new Stack<>(); HashMap
map = new HashMap<>(); int[] ans = new int[nums1.length]; if(nums1.length == 0){ return ans; } stack.push(nums2[0]); for(int i = 1; i < nums2.length; i++){ if(nums2[i] <= stack.peek()){ stack.push(nums2[i]); }else{ while(!stack.isEmpty() && nums2[i] > stack.peek()){ map.put(stack.pop(),nums2[i]); } stack.push(nums2[i]); } } for(int i = 0; i < nums1.length; i++){ if(map.containsKey(nums1[i])){ ans[i] = map.get(nums1[i]); }else{ ans[i] = -1; } } return ans; }}

 

 

转载地址:http://vnzji.baihongyu.com/

你可能感兴趣的文章
mongoDB简介
查看>>
Redis持久化存储(AOF与RDB两种模式)
查看>>
memcached工作原理与优化建议
查看>>
Redis与Memcached的区别
查看>>
redis sharding方案
查看>>
程序员最核心的竞争力是什么?
查看>>
Node.js机制及原理理解初步
查看>>
linux CPU个数查看
查看>>
分布式应用开发相关的面试题收集
查看>>
简单理解Socket及TCP/IP、Http、Socket的区别
查看>>
利用HTTP Cache来优化网站
查看>>
利用负载均衡优化和加速HTTP应用
查看>>
消息队列设计精要
查看>>
分布式缓存负载均衡负载均衡的缓存处理:虚拟节点对一致性hash的改进
查看>>
分布式存储系统设计(1)—— 系统架构
查看>>
MySQL数据库的高可用方案总结
查看>>
常用排序算法总结(一) 比较算法总结
查看>>
SSH原理与运用
查看>>
SIGN UP BEC2
查看>>
S3C2440中对LED驱动电路的理解
查看>>