赞
踩
给定一个循环数组 nums
( nums[nums.length - 1]
的下一个元素是 nums[0]
),返回 nums
中每个元素的 下一个更大元素 。
数字 x
的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1
。
示例 1:
输入: nums = [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
示例 2:
输入: nums = [1,2,3,4,3] 输出: [2,3,4,-1,4]
1 可以用暴力方法对数组进行遍历,记录下最大值,找到就break,如果等于最大值就赋为-1,利用取余实现循环
2 用一个单向栈来保存下标,遍历每个数据,判断栈是否为空并且栈顶元素是否小于现在的值,如果是,那现在这个值就是栈里所以小于他的第一个 最大值,这里不需要再做额外的判断,因为从栈顶开始一直到为空或栈底值不小于当前值 。栈里一定是从底到顶递减,否则早出栈了。
循环遍历的话,用取余解决。
代码
- class Solution {
- public int[] nextGreaterElements(int[] nums) {
- int[] ans=new int[nums.length];
- int max=nums[0];
- for(int i=0;i<nums.length;i++){
- max=Math.max(max,nums[i]);
- }
- for(int i=0;i<nums.length;i++){
- int j=(i+1)%nums.length;
- while(true){
- if(nums[j]>nums[i]){
- ans[i]=nums[j];
- break;
- }
- if(nums[i]==max){
- ans[i]=-1;
- break;
- }
- j=(j+1)%nums.length;
- }
- }
- return ans;
-
- }
- }
- class Solution {
- public int[] nextGreaterElements(int[] nums) {
- int n=nums.length;
- int[] ans=new int[n];
- Arrays.fill(ans, -1);
- Deque<Integer> st=new ArrayDeque<>();
- for(int i=0;i<n*2;i++){
- while(!st.isEmpty()&&nums[i%n]>nums[st.peek()]){
- ans[st.pop()]=nums[i%n];
- }
- if(i<n){
- st.push(i);
- }
- }
- return ans;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。