`

java-61-在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差. 求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5,

 
阅读更多
思路来自:http://zhedahht.blog.163.com/blog/static/2541117420116135376632/
写了个java版的


public class GreatestLeftRightDiff {

	/**
	 * Q61.在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差。
	 * 求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。
	 */
	public static void main(String[] args) {
		int[] a={2, 4, 1, 16, 7, 5, 11, 9};
		int result=greatestLeftRightDiff01(a);
		System.out.println(result);
		result=greatestLeftRightDiff02(a);
		System.out.println(result);
		
	}
	/*引用原文:
	 * 如果输入一个长度为n的数组numbers,我们先构建一个长度为n-1的辅助数组diff,
	 * 并且diff[i]等于numbers[i]-numbers[i+1](0<=i<n-1)。
	 * 如果我们从数组diff中的第i个数字一直累加到第j个数字(j > i),
	 * 也就是diff[i] + diff[i+1] + … + diff[j] 
	 * = (numbers[i]-numbers[i+1]) + (numbers[i + 1]-numbers[i+2]) + ... + (numbers[j] – numbers[j + 1])
	 *  = numbers[i] – numbers[j + 1]。
	 *  分析到这里,我们发现原始数组中最大的数对之差(即numbers[i] – numbers[j + 1])
	 *  其实是辅助数组diff中最大的连续子数组之和。
	 */
	public static int greatestLeftRightDiff01(int[] a){
		if(a==null||a.length<2){
			return Integer.MIN_VALUE;//min=1<<31
		}
		int len=a.length;
		int[] diff=new int[len-1];
		for(int i=1;i<len;i++){
			diff[i-1]=a[i-1]-a[i];
		}
		return greatestSumOfSubArray(diff);
	}
	
	/*
	 *1.我的理解:从i=2开始遍历,找出i之前的最大元素,记为max,max减去当前元素a[i],如果这个差值比旧差值大,则更新旧差值
	 *2.引用原文:
	 *我们定义diff[i]是以数组中第i个数字为减数的所有数对之差的最大值。
	 * 也就是说对于任意h(h < i),diff[i]≥number[h]-number[i]。diff[i](0≤i<n)的最大值就是整个数组最大的数对之差。
	 * 假设我们已经求得了diff[i],我们该怎么求得diff[i+1]呢?对于diff[i],肯定存在一个h(h < i),满足number[h]减去number[i]之差是最大的,也就是number[h]应该是number[i]之前的所有数字的最大值。当我们求diff[i+1]的时候,我们需要找到第i+1个数字之前的最大值。
	 * 第i+1个数字之前的最大值有两种可能:这个最大值可能是第i个数字之前的最大值,也有可能这个最大值就是第i个数字。
	 * 第i+1个数字之前的最大值肯定是这两者的较大者。
	 * 我们只要拿第i+1个数字之前的最大值减去number[i+1],就得到了diff[i+1]。
	 */
	public static int greatestLeftRightDiff02(int[] a){
		if(a==null||a.length<2){
			return Integer.MIN_VALUE;//min=1<<31
		}
		int len=a.length;
		int max=a[0];
		int diff=max-a[1];
		for(int i=2;i<len;i++){
			if(max<a[i-1]){
				max=a[i-1];
			}
			int newDiff=max-a[i];
			if(newDiff>diff){
				diff=newDiff;
			}
		}
		return diff;
	}
	
	
	public static int greatestSumOfSubArray(int[] array){
		int sum=0;
		int max=0;
		for(int i=0,len=array.length;i<len;i++){
			sum+=array[i];
			if(sum<=0){
				sum=0;
			}else{
				if(sum>max){
					max=sum;
				}
			}
		}
		return max;
	}
}

分享到:
评论

相关推荐

    数对之差的最大值

    在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。

    数组中数对差最大

    数组中某数字减去其右边的某数字得到一个数对之差,求所有数对之差的最大值。

    数字翻译为英文的c++实现

    注意,输入时,在数组中存储的是ASCII码,应将其减去48,得到相应数字。 3、 要考虑输入溢出问题,此时可以在用户输入后加一个判断,若超出存储数组的最大限度则给用户错误警告并退出。 4、 输出:考虑到格式,如...

    三位数重排求差“数学黑洞”

    “重排求差”操作:是将一个数的各位数字重排得到最大数减去最小数。请编程进行验证。 如:数107,“重排求差”操作序列为:710-17=693,963-369=594,954-459=495 要求: (1)定义函数void Digitn (int x,int &max...

    PTA黑洞数(C语言版)

    任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。) 例如...

    对python3 一组数值的归一化处理方法详解

    1、什么是归一化: 归一化就是把一组数(大于1)化为以1为最大值,0为最小值,其余数据按百分比计算的方法。...3、用python 把一个矩阵中每列的数字归一化 import numpy as np def autoNorm(data):

    黑洞数也称为陷阱数,又称“Kaprekar问题”

    任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。例如,对三位数207:第1次重排...

    java常用工具类的使用

    该类的大部分构造器和方法都已经过时,但是该类使用非常方便,因此目前使用还很普遍,该类的另一个主要功能是,在数据库操作中,它允许将毫秒值表示为SQL DATE值,是数据库操作中java.sql.Date的父类。关于数据库...

    西西弗斯黑洞【123数字黑洞】 卡普雷卡尔黑洞(重排求差黑洞):三位数黑洞495

    /// ​设定一个任意数字串,数出这个数中的偶数个数,奇数个数,及这个数中所包含的所有位数的总数 /// 比如86420135799,按照偶数个数5,奇数个数6,数字总个数11,拼接成一个新的整数 5611 /// 然后依次转化为...

    java异或-Java异或运算总结.pdf

    题⼲: 题⼲:1-1000这1000个数放在含有1001个元素的数组中,只有唯⼀的⼀个元素值重复,其它均只出现 ⼀次。每个数组元素只能 访问⼀次,设计⼀个算法,将它找出来;不⽤辅助存储空 间,能否设计⼀个算法实现? 第...

    c语言随机数组求最大值

    c语言学习资料,数据结构简单练习题,产生随机数并求亲自的最大值

    微软JavaScript手册

    join 方法 返回一个由数组中的所有元素连接在一起的 String 对象。 Labeled 语句 给语句提供一个标识符。 lastIndex 属性 返回在字符串中找到的最后一个成功匹配的字符位置。 lastIndexOf 方法 返回在 String ...

    javascript文档

    join 方法 返回一个由数组中的所有元素连接在一起的 String 对象。 Labeled 语句 给语句提供一个标识符。 lastIndex 属性 返回在字符串中找到的最后一个成功匹配的字符位置。 lastIndexOf 方法 返回在 String ...

    JScript 语言参考

    join 方法 返回一个由数组中的所有元素连接在一起的 String 对象。 Labeled 语句 给语句提供一个标识符。 lastIndex 属性 返回在字符串中找到的最后一个成功匹配的字符位置。 lastIndexOf 方法 返回在 String ...

    oracle函数大全.doc

    在一个字符串中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 出现的位置,默认为1 SQL&gt; select instr('oracle traning','ra',1,2) instring from ...

    Java数组,去掉重复值、增加、删除数组元素的方法

    下面小编就为大家带来一篇Java数组,去掉重复值、增加、删除数组元素的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    蓝桥杯历年C++题目:水仙花数和数字黑洞

    · 随机选择4个数字(不可相同)按照从大到小排成一个数字,再用这个数字减去从小到大排成的数字,再把结果包括的数字按照以上步骤继续。最后7步必得包括6、1、4、7的数字,即7641 - 1467 = 6147,仿佛掉进了黑洞,...

    JAVA实战项目源码-计算机毕业设计SSM项目java专业-java进销存管理系统(jsp+mysql)

    JAVA实战项目源码-计算机毕业设计SSM项目java专业-java进销存管理系统(jsp+mysql) 软件分前台收银和收台管理两大部分: 前台可对不同会员卡产生不同的折扣率,前台涉及三张数据库表的操作: 商品表—用来查找相应的...

    MYSQL,SQLSERVER,ORACLE常用的函数

    在一个字符串中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 出现的位置,默认为1 SQL&gt; select instr('oracle traning','ra',1,2) instring ...

Global site tag (gtag.js) - Google Analytics