`

java-求数组中两两元素之差绝对值最小值

阅读更多
import java.util.Arrays;

public class MinDifference {

	/**
	 * 题目:求数组中两两元素之差绝对值最小值
solution 1.sort the data array.Find the min difference between two adjacent element.
solution 2.
设这个整数数组是a1,a2,...,an
构造数组B=(b1,b2,...,bn-1) 
b1 = a1-a2, 
b2 = a2-a3, 
b3 = a3-a4, 
... 
bn-1 = an-1 - an 

那么原数组中,任意两整数之差ai-aj(1 <=i,j <=n)可以表示成 
B中第i个到第j-1个元素的连续求和 

例如b2+b3+b4 = (a2-a3) + (a3-a4) + (a4-a5) = a2-a5 

O(n)构造出B序列后 

用类似“最大子段和”算法求“最小绝对值子段和”

但是,如何求得“最小绝对值子段和”?我没有想出来。。。
	 */
	public static void main(String[] args) {

		int[] data={1,2,4,8,15,20,18,-3,11};
		int min=minDifference(data);
		System.out.println(min);
	}

	public static int minDifference(int[] data){
		if(data==null||data.length==0){
			return Integer.MIN_VALUE;
		}
		sort(data,0,data.length-1);
		int len=data.length;
		int[] diff=new int[len-1];
		for(int i=0;i<len-1;i++){
			diff[i]=data[i+1]-data[i];
		}
		//System.out.println(Arrays.toString(diff));
		return min(diff);
	}
	public static int min(int[] diff){
		if(diff==null||diff.length==0){
			return Integer.MIN_VALUE;
		}
		int min=diff[0];
		for(int i=0,len=diff.length;i<len;i++){
			//not necessary,since 'int[] data' is sorted,so 'int[] diff' is progressively increased.
			//int tmp=diff[i]>0?diff[i]:(-diff[i]);
			if(min>diff[i]){
				min=diff[i];
			}
		}
		return min;
	}
	
	//QuickSort.Of course we can use Arrays.sort(),but I write it for practice.
	public static void sort(int[] x,int s,int e){
		if(s>=e){
			return;
		}
		int i=s;
		int j=e;
		boolean flag=false;
		while(i!=j){
			if(x[i]>x[j]){
				swap(x,i,j);
				flag=!flag;
			}
			if(flag){
				i++;
			}else{
				j--;
			}
		}
		sort(x,s,i-1);
		sort(x,j+1,e);
	}
	
	public static void swap(int[] x,int i,int j){
		int tmp=x[i];
		x[i]=x[j];
		x[j]=tmp;
	}
}

0
0
分享到:
评论

相关推荐

    1.给出一个整数数组,求其中任意两个元素之差的最大值。

    ### 第一部分:求整数数组中任意两个元素之差的最大值 #### 题目背景与需求 题目要求给定一个整数数组,计算并返回数组中任意两个元素之差的最大值。 #### 解决方案 为了找到数组中任意两个元素之差的最大值,可以...

    算法面试通关40讲完整课件 05-07 数组、链表

    1. 访问(Access):由于元素的位置是已知的,因此可以使用下标直接访问数组中的任何元素,时间复杂度为O(1)。 2. 插入(Insert):在数组中插入元素通常需要移动后续元素,因此平均时间复杂度为O(n)。在末尾插入...

    js判断数组是否相等的方法

    1. **数组完全相等**:在这种情况下,不仅要求数组中的元素相同,而且元素的顺序也必须一致。如上文所示,有几种方法可以用来检查这种相等性。 - 使用`join('')`方法:将数组转换为字符串,然后比较字符串是否相等...

    Java中数组实例---冒泡排序.pdf

    4. **交换操作**:在Java中,交换两个数组元素的位置可以通过一个临时变量实现。例如,交换`arr[i]`和`arr[j]`可以这样写: ```java int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; ``` 5. **输出过程**...

    计算机软件及应用C语言之数组PPT学习教案.pptx

    计算机软件及应用C语言之数组是编程学习中的基础概念,主要涉及如何定义、引用和操作数组。在C语言中,数组是一种数据结构,允许我们存储一组相同类型的数据。以下是关于数组的一些关键知识点: 1. **定义数组**: ...

    Java-面试题(下)

    - 在数组中找到最小(或最大)元素,存放到排序序列起始位置。 - 继续从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。 - 重复上述过程,直到所有元素均排序完毕。 Java实现示例: ```...

    java-leetcode题解之第24题两两交换链表中的节点.zip

    在Java中,链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的引用。对于本题,我们需要理解链表的基本操作,如遍历、创建新链表以及修改链表结构。具体来说,题目要求我们交换相邻的...

    js代码-数组内两数相加等于某值

    这个问题的基本需求是找到一个数组中的两个元素,使得它们的和等于一个特定的目标值。以下是对这个主题的详细解释: 首先,我们需要理解数组的概念。在JavaScript中,数组是一种数据结构,它可以存储一系列的值,...

    php-leetcode题解之两两交换链表中的节点.zip

    在本压缩包“php-leetcode题解之两两交换链表中的节点.zip”中,包含的是关于使用PHP解决LeetCode算法题目的一个实例——“两两交换链表中的节点”。这个题目是LeetCode上的经典链表操作问题,旨在锻炼开发者对链表...

    labview处理两个数组相关的数组

    具体可以看这个连 https://blog.csdn.net/Li_haiyu/article/details/85469528 然后确定是否需要

    java-日记 前端

    * 一维数组选择排序:获取当前没有排好序中的最大元素和数组最右端的元素交换,循环这个过程即可实现对整个数组排序。 * 冒泡排序:依次两两比较排序元素,将带排序元素从左至右比较一遍称为一趟“冒泡”。 三、栈...

    leetcode中国-Array:用Java练习数组

    求绝对值最小数 FindMinDistance 求两元素最小距离 FindFirstIndex 找第一次出现位置下标 CombineAWithB 插入数成整体有序数组 FindSame 找出两有序数组交集 IsContinuous 判断数组中数值是否连续

    js代码-对象数组的排序问题

    它会遍历数组中的所有元素,并将它们两两比较,然后根据比较结果重新排列。比较函数通常有两个参数,代表被比较的两个元素。如果返回值小于0,那么第一个元素会被排在第二个元素之前;如果返回值大于0,则反之;如果...

    计算机算法设计与分析2-15

    1. **分组比较**:将数组中的元素两两分组,每组内的两个元素进行一次比较。 2. **选择最大值和最小值**:在每组内部,较大的元素将作为候选最大值,较小的元素则作为候选最小值。 3. **进一步筛选**:从所有候选...

    2017上大计科真题回忆版1

    - **算法题-3**:寻找数组中两两元素之差的绝对值最小值,可能涉及到排序或哈希表来优化搜索过程。 这些题目覆盖了计算机科学的核心内容,对考生的理论理解和实践能力都有较高要求。复习时,考生需要扎实掌握...

    JS实现二维数组元素的排列组合运算简单示例

    本文实例讲述了JS实现二维数组元素的排列组合运算。分享给大家供大家参考,具体如下: 用js实现二维数组里面的元素排列组合一个小demo; 源码: &lt;!DOCTYPE ...

    逆序对(树状数组) C语言

    对于数组a[i]到a[j]的逆序对数量,可以通过查询树状数组c,得到区间内所有元素的两两之和,再减去区间内元素的总和的平方,得到逆序对数。这个过程可以使用前缀和和树状数组的查询功能来实现。 4. **C语言实现**: ...

    行业分类-设备装置-两两胶合内页形成书芯的装置和形成方法.zip

    书芯的制作在印刷行业中是一项重要的工艺步骤,它关乎到书籍的质量和耐用性。"两两胶合内页形成书芯的装置和形成方法"是一个专门针对这一环节的技术方案,旨在提高生产效率和产品质量。本技术主要关注的是如何将单个...

    GSE81558-3个分组两两之间差异分析-标准代码.gz

    标题中的"GSE81558-3个分组两两之间差异分析-标准代码.gz"揭示了这是一个关于生物信息学研究的项目,具体来说,是基因表达数据的差异分析。GSE通常代表 GEO(Gene Expression Omnibus),这是一个由NCBI(美国国立...

Global site tag (gtag.js) - Google Analytics