如数组A=[1,5,3,6,4,8,9,10] 输出[5, 6, 6, 8, 8, 9, 10, -1]
如数组A=[8, 2, 5, 4, 3, 9, 7, 2, 5] 输出[9, 5, 9, 9, 9, -1, -1, 5, -1]
1、暴力遍历
复杂度为O(n^2)的解法,遍历数组中的每一个后面所有元素,找到第一个大于它的,输出即可
public static int[] findMaxRight(int[] array) {
if(array == null)
return array;
int size = array.length;
int[] result = new int[size];
for (int i = 0; i < size - 1; i++) {
for (int j = i+1; j < size; j++) {
if(array[j] > array[i]) {
result[i] = array[j];
break;
}
}
}
result[size-1] = -1;//最后元素没有右边元素
return result;
}
2、借助栈,时间复杂度O(n)
具体思路是:我们用栈来保存未找到右边第一个比它大的元素的索引(保存索引是因为后面需要靠索引来给新数组赋值),初始时,栈里放的是第一个元素的索引0值。
第二种方是以空间换时间,用到了数据结构栈,用到了单调栈思想,单调栈可以用来解决一类问题,单调栈是指:栈内元素保持一定单调性(单调递增或单调递减)的栈。这里的单调递增或递减是指的从栈顶到栈底单调递增或递减。既然是栈,就满足后进先出的特点。与之相对应的是单调队列。
public static int[] findMaxRight(int[] array) {
if(array == null)
return array;
int size = array.length;
int[] result = new int[size];
Stack<Integer> stack = new Stack<>();
stack.push(0);
int index = 1;
while(index < size) {
if(!stack.isEmpty() && array[index] > array[stack.peek()]) {
result[stack.pop()] = array[index];
}else {
stack.push(index);
index++;
}
}
if(!stack.isEmpty())
result[stack.pop()] = -1;
return result;
}
主函数:
public static void main(String[] args) {
int[] arr = {1,5,3,6,4,8,9,10};
int[] res = findMaxRight(arr);
for (int i = 0; i < res.length; i++) {
System.out.print(res[i] +" ");
}
}