数组常见问题
2021-02-21 本文已影响0人
知止9528
寻找左右两边第一个比自己大的数
public class MY_寻找左右两边第一个比它大的数 {
public static void main(String[] args) {
int[] nums = {3, 8, 5, 6, 9, 2, 1, 7};
System.out.println(Arrays.toString(nums));
printLeftAndRightFirstMax(nums);
}
public static void printLeftAndRightFirstMax(int[] nums) {
int len = nums.length;
int[] left = new int[len];
int[] right = new int[len];
//数据初始化
for (int i = 0; i < len; i++) {
left[i] = -1;
right[i] = -1;
}
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < len; i++) {
while (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {
//弹出栈内元素 并且更新右边第一个比它大的数
right[stack.pop()] = i;
}
if (!stack.isEmpty() && nums[i] < nums[stack.peek()]) {
left[i] = stack.peek();
}
stack.push(i);
}
for (int i = 0; i < nums.length; i++) {
System.out.println("第" + i + "个数为:" + nums[i]);
System.out.println("左边第一个比它大的数为:" + nums[left[i]==-1?i:left[i]]);
System.out.println("右边第一个比它大的数为:" + nums[right[i]==-1?i:right[i]]);
System.out.println("=======================");
}
}
}