题目:给定一个整型数组,数组元素随机无序的,要求打印出所有元素右边第一个大于该元素的值。
如数组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 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;//最后一个元素右边没有元素,所以肯定为-1
return result;
}
2、借助栈,时间复杂度O(n)
如果要求时间复杂度为O(n)呢,能不能遍历一次数组中元素,就可以找到右边第一个大于它的元素呢,当然是可行的,不过要借助数据结构栈。
具体思路是:我们用栈来保存未找到右边第一个比它大的元素的索引(保存索引是因为后面需要靠索引来给新数组赋值),初始时,


1190

被折叠的 条评论
为什么被折叠?



