一道未解决的称不上算法的算法题

题目:

在这插入图片描述
在这里插入图片描述
在这里插入图片描述
翻译翻译:
题目的解决思路是,在一组数组中,向左去寻找第一个比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],换一些其他的输入值结果就不符合预期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值