【谷歌面试题】给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i < j)并且j-i最大

这道谷歌面试题要求在数组A中找到一对(i, j),满足A[i] <= A[j]且j-i最大。初始解决方案为O(n^2),改进后使用O(n)时间复杂度,通过从数组右端开始向前找到每个i位置的最大右端匹配j,从而提高效率。" 51745149,5032683,XML基础:语法与解析,"['XML', '网络', 'iOS开发', '数据解析']
摘要由CSDN通过智能技术生成

题目:给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i <= j)并且j-i最大 ,若有多个这样的位置对,返回i最小的那一对。

最直接的想法就是对于每一个 i 从数组最尾端开始向前找到第一个大于等于 A[i] 的位置 j ,时间复杂度O(n^2)。

pair<int, int> find(const vector<int> &A)
{
	int n = A.size();
	if(n == 0)
		throw new invalid_argument("Array's size can't be 0!");

	int target_i = 0, target_j = 0;
	int max_len = 0;
	for(int i = 0; i < n; ++i)
	{
		int j;
		for(j = n-1; j >= i; --j)
			if(A[j] >= A[i])
				break;
		if(j-i+1 > max_len)
		{
			target_i = i;
			target_j = j;
			max_len = j-i+1;
		}
	}

	return make_pair<int, int>(target_i, target_j);
}
我们对上述算法稍作优化。当i=0时,我们假设找到的大于A[i]的最右位置是j0,那么对于i=1时,我们根本就不需要考虑小于j0的位置,因为它们的区间长度都小于j0+1,不可能成为最优解。

pair<int, 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值