`

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;
	}
}

分享到:
评论

相关推荐

    数对之差的最大值

    在这个问题中,我们面临的是一个关于数组操作的挑战,具体来说是寻找数组中数对之差的最大值。这个问题可以归类为数组处理中的简单算法问题,通常可以通过一次遍历或排序来解决。 首先,我们要理解“数对之差”的...

    java大数(以数组形式保存整数,实现整数加减)

    - **共享数组**:如果两个大数长度相同且不需要改变原数,可以直接在其中一个数的数组上进行运算,避免创建新的数组。 - **数组长度动态调整**:数组长度可以根据实际需要动态调整,初始时可以设定一个较小的长度,...

    java 数组实现大数加减乘除运算

    在Java编程中,处理大数(大数据)的加减乘除运算是一项常见的需求,尤其是在金融、科学计算等领域。数组作为一种基础数据结构,可以用来存储这些大数,通过自定义算法来实现四则运算。以下是对标题和描述中涉及的...

    java-leetcode题解之Find the Missing Number.java

    在解决LeetCode中的“寻找缺失的数字”问题时,我们需要编写Java代码,通过算法高效地找出一个整数序列中缺失的数字。该问题通常给出一个包含n个元素的整数数组,其中包含从0到n的整数,但有一个数字是缺失的。我们...

    用于十进制到二进制转换的 Java 程序-3. ,使用 Math.pow() 方法(不使用数组)

    在编程领域,数制转换是一个常见的操作,尤其在数据结构和算法的学习过程中。这篇文档主要介绍了一个用Java编写的程序,该程序用于将十进制数转换为二进制数,而无需使用数组。关键在于利用了Java语言提供的Math.pow...

    26进制字母转换成数字

    在给定的代码中,我们可以看到一个Java类 ts,它包含了两个方法:letterToNum(String str) 和 charToNum(char ch)。其中,letterToNum(String str) 方法用于将一个字符串转换成数字,而 charToNum(char ch) 方法用于...

    Java 编写的数字金字塔的示例代码.zip

    本主题将深入探讨一个基于Java编写的数字金字塔的示例代码,这是学习Java基础和控制流的一个有趣实践。 数字金字塔,也被称为数阵或数列,是一种特殊的数字排列方式,通常以等腰三角形的形式展示,每行的数字数量...

    java删除数组中的某一个元素的方法

    下面我们将详细探讨如何在Java中删除数组中的某一个元素。 1. **替换法**: 由于数组的长度是固定的,不能直接删除元素,所以我们通常选择将要删除的元素替换为数组末尾的元素,然后缩小数组的长度。这种方法的...

    计算机程序设计java语言数字排序问题.docx

    具体而言,这个任务是筛选出千位数字减去百位、十位和个位数字大于零的数,将这些数存入数组`b`中,并将`b`中的数字按照从小到大的顺序进行排序。问题的解决方法首先需要遍历数组`a`,逐个计算出每个四位数的千位、...

    【LeeCode】初级算法案例+java代码(数组篇)(csdn)————程序.pdf

    可以使用哈希表来存储每个元素及其索引,然后检查每个元素,看它的补数(目标值减去它)是否在哈希表中。 这些初级算法案例旨在帮助初学者理解和掌握基础数据结构和算法,通过Java代码实现,方便读者学习和实践。...

    float转byte数组测试小工具

    在IT领域,数据类型转换是常见的操作之一,特别是在处理数据存储和网络通信时。本工具“float转byte数组测试小工具”专注于将浮点数(float)转换为字节数组,这是一种在计算机内存中表示和传输数值的常用方式。在...

    JAVA循环 练习题

    - **题目解析**:定义一个方法,在main方法中调用它。 - **实现思路**:定义一个非静态方法,然后在main方法中实例化对象并调用该方法。 #### 39. 分段函数求和 - **题目解析**:根据输入的n值,计算分段函数的和。...

    Java中数字黑洞实现代码

    在探讨编程世界中,数字黑洞是一个有趣的数学游戏,也被称作6174算法,它基于一个简单的概念:从任意四位数开始,经过一系列的排序和减法操作,最终都会得到一个固定的数字6174。在Java编程语言中实现这一游戏,不仅...

    java 基础试题

    3. **计算缺失的数字:** 用1到100的总和减去数组中所有数字的总和即可得到缺失的数字。 **示例代码:** ```java public static int findMissingNumber(int[] nums) { // 计算1到100的总和 int totalSum = (100 *...

    JAVA经典算法.doc

    数组问题中,给定一个长度为1001的数组,数组元素取值范围为1到1000,其中有一个重复的数字。我们可以利用数组元素之和与等差数列求和的性质来找到这个重复的数字。数组元素之和减去1到1000的自然数之和,差值即为...

    自动生成数组并转置数组

    在这个场景中,我们讨论的是如何自动生成一个二维数组,其元素为1到10的整数,并对这个数组进行转置。 首先,让我们理解如何创建一个二维数组。在大多数编程语言中,二维数组可以看作是由多个一维数组组成的。例如...

    java 笔试题

    3. **数学法**:利用等差数列求和公式计算1到100的所有自然数之和,减去数组中所有元素的总和,即可得到缺失的数字。 这里我们选择第三种方法——**数学法**,因为它不仅简单而且效率高,时间复杂度为O(n)。 #### ...

    [JAVA]2048 游戏代码

    在Java代码中,棋盘通常会被表示为二维数组,每个元素存储一个整数值。为了实现移动操作,我们需要遍历数组的每一行或每一列,根据移动方向进行相应的处理。例如,当向左移动时,我们需要从左到右比较相邻的元素,...

    c语言-leetcode题解448-find-all-numbers-disappeared-in-an-array.c

    C语言解决此题的一个巧妙方法是利用原地哈希的思想,通过遍历数组,并在遍历的过程中恢复数组中数字1到n的原始排列,对于未被恢复的位置,即为消失的数字。 对于数组中的每一个元素,假设其值为n,我们可以通过将n-...

    两个五百位的数相加(数组)

    4. **进位处理**:对于每一次加法,如果结果大于9,则从结果中减去10,并设置一个标志位`flag`为1,表示下一次加法需要额外加上1(即进位)。 5. **结果输出**:最后,根据计算结果,程序输出最终的大数和。 #### ...

Global site tag (gtag.js) - Google Analytics