最大差值

题目描述
有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值。

给定数组A及它的大小n,请返回最大差值。

测试样例:
[10,5],2
返回:0

本来是想用map来储存值,键的,结果map是不能重复的,所以用了别的方法,

暴力解法:

import java.util.*;

public class LongestDistance {
    public int getDis(int[] A, int n) {
        // write code here
        int max = 0;
		for (int i = 0; i < A.length; i++) {
			for (int j = i; j < A.length; j++) {
				if(A[j]-A[i]>max)max = (A[j]-A[i]);
			}
		}
		return max;
    }
}

因为看到这道题在牛客网的贪心分类是热度最高的,以为会比较经典。

看看优化解法:时间复杂度只有O(n)

import java.util.*;

public class LongestDistance {
    public int getDis(int[] A, int n) {
        // write code here
        int max = 0;
		if(n>1) {
			int min = A[0];
			for (int i = 0; i < A.length; i++) {
				if(A[i]-min>max)max = A[i]-min;
				if(min>A[i])min = A[i];
			}
			
		}
		return max;
    }
}

心得:这个最优解的做法,其实就是充分利用时间资源。在一个循环里,某个参数如果是根据该循环的改变而改变的,就可以在循环中直接使用这个参数。而两个for循环就是直接把数组中的所有数相减,并没有提前把最小值数据化。

这是一种很经典的减少时间复杂度的做法,我在很多的很好的解法中看到被用,我觉得大家都可以学习的,这种方法就是在for循环或while循环中,对比数据得到可得到符合条件的当前最小值或最大值,并利用当前的参数对数据的结果进行帮助计算的,可以有效的减少时间复杂度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值