OD 算法题 B卷【阿里巴巴找黄金宝箱4】
文章目录
- 阿里巴巴找黄金宝箱4
阿里巴巴找黄金宝箱4
- 有1~N个箱子排成一个环,每个箱子有自己对应的编号;
- 输出每一个箱子后第一个比自己编号大的数;
- 找到的多个数以,分隔输出;
示例1:
输入:
2,5,2
输出
5,-1,5
示例2:
输入:
3,4,5,6,3
输出
4,5,6,-1,4
思路:
- 数组复制一份,拼接在一起(每个数找一圈);
- 单调栈,从栈顶到栈底,递增为单调递增栈;否则为单调递减栈;
- 单调栈解决大小关系;
python实现:
arr = list(map(int, input().strip().split(",")))
n = len(arr)# 存储找到的第一个比自己大的数
arr2 = [-1 for i in range(n)]# 单调栈,存储当前的索引
stack = []
# 双份数组 或者 圆圈索引求模
double_arr = arr + arrfor i in range(2*n):cur_data = double_arr[i]while stack and cur_data > arr[stack[-1]]:# 找到当前比idx处大的第一个数cur_idx = stack.pop()arr2[cur_idx] = cur_data# 有效索引入栈 (>=n的索引无效)if i < n:# 索引入栈stack.append(i)arr2_str = map(str, arr2)
print(",".join(arr2_str))
java
import java.util.Scanner;
import java.util.*;
import java.lang.Integer;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int len = nums.length;//将数组复制成双份数组([1,2,3] -> [1,2,3,1,2,3])int[] doubleNums = Arrays.copyOf( nums, len *2);System.arraycopy( nums, 0, doubleNums, len, len);//各位置对应第一个比他大的数int[] resInts = new int[len];//初始化为 -100001,因为宝箱数值范围 >= -100000,<=100000Arrays.fill( resInts, -100001);Deque<Integer> deque = new ArrayDeque<>();for(int i=0; i<len*2; i++){int num = doubleNums[i];System.out.println("55--" + num);//单调栈while (!deque.isEmpty() && num > nums[deque.peek()]){ // deque.peek() 访问栈顶//双向队列中有值,且最后一个值小于当前数字则取出//并通过队列中的索引,对 resInts 进行赋值System.out.println("出队" + num);int index = deque.pop(); // 弹出栈顶resInts[index] = num;}if(i < len){System.out.println("入队" + i);deque.push(i);}}String res = "";for(int i : resInts){if(i == -100001){//等于 -100001 说明不存在,则输出 -1i = -1;}res += i + ",";}System.out.println(res.substring( 0, res.length() - 1));}}
 ;