题目:
翻译翻译:
题目的解决思路是,在一组数组中,向左去寻找第一个比A[i]大的元素,并将找到的数组元素下标记录在一个新的数组中,如果没有找到,那么结果为-1,所以以下是暴力解,时间复杂度O(n2)
public int[] communicate(int[] A){
int length = A.length;
int[] res = new int[length];
for (int i = 0; i < length; i++) {
res[i] = -1;
}//初始化res数组
for(int i = 0;i < length;i++){
for(int j = i-1;j > -1 ;j--){
if(A[j] > A[i]){
res[i] = j;
break;
}
}
}
return res;
}
进行优化,维护一个栈的数据结构,剪去内层循环:
public int[] communicate(int[] A) {
int length = A.length;
int[] res = new int[length];
for (int i = 0; i < length; i++) {
res[i] = -1;
}//初始化res数组
Stack.push(length - 1);
//栈内 存放的是数组A的下标
for (int i = 0; i < length; i++) {
if (A[length - 1 - i] > A[(Integer) Stack.topElement()]) {
res[(Integer) Stack.topElement()] = length - 1 - i;
Stack.pop();
}//倒序将数组元素插入栈 如果新插入元素比栈顶元素大 弹出栈顶元素
Stack.push(length - 1 - i);
}
return res;
}
其中栈Stack的实现如下,底层维护了一个ArrayList的集合
public class Stack{
private static ArrayList<Object> list = new ArrayList<Object>(1000);
public static void push(Object obj){
list.add(obj);
}
public static void pop(){
Object obj = null;
if(!list.isEmpty()){
obj = list.get(list.size() -1 );
list.remove(obj);
}else {
return;
}
}
public static Object topElement(){
return list.get(list.size() - 1);
}//获取栈顶元素
}
目前此代码有Bug,只适用于题目中给的例子,即输入[5,3,1,6,4],返回[-1,0,1,-1,3],换一些其他的输入值结果就不符合预期