求a[j]-a[i]的最大值,其中j>=i

题目出自数据结构与算法分析2.28


常规思路是用两个for循环嵌套,但是时间复杂度会是O(N²)。


然后书中推荐的方法是O(N),先给出思路和代码:


首先最大值的初始值应该是0,当i=j时

要找到a[j]-a[i]的最大值,也就是找到a[j]之前的最小值,所以当下标j向前扫描时,如果相减的值大于当前最大值,则更新最大值,如果相减的值小于0,也就是a[j]小于a[i],此时将最小值设定为当前的a[j],即i=j,然后继续扫描至结束。


整个过程只对数组进行一次扫描,即下标j不断向前。

public class Max
{
	public static void main(String[] args){
		int[] arr = new int[]{5,2,3,7,4,9,6,2,4,7};
		int maxi = arr[0];		//记录j之前最小的a[i]
		int maxMinus = 0;		//记录最大差值
		int a = 0;				//记录最大差值的i下标
		int b = 0;				//记录最大差值的j下标
		int temp = 0;			//暂存最大差值的i下标
		for (int j = 0; j < arr.length ; j++)
		{
			if ((arr[j] - maxi) > maxMinus)	//当小于当前的最大差值时
			{
				maxMinus = arr[j] - maxi;		//更新最大差值
				a = temp;
				b = j;
				
			}
			else if ((arr[j] - maxi) < 0)		//当小于当前最小的a[i]时
			{
				maxi = arr[j];				//更新最小的a[i]
				temp = j;
			}
		}
		System.out.println("最大差值是a[" + b + "]-[" + a + "]=" + maxMinus);
	}
}


发布了36 篇原创文章 · 获赞 0 · 访问量 4978
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章