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;
}
}
分享到:
相关推荐
### 第一部分:求整数数组中任意两个元素之差的最大值 #### 题目背景与需求 题目要求给定一个整数数组,计算并返回数组中任意两个元素之差的最大值。 #### 解决方案 为了找到数组中任意两个元素之差的最大值,可以...
1. 访问(Access):由于元素的位置是已知的,因此可以使用下标直接访问数组中的任何元素,时间复杂度为O(1)。 2. 插入(Insert):在数组中插入元素通常需要移动后续元素,因此平均时间复杂度为O(n)。在末尾插入...
1. **数组完全相等**:在这种情况下,不仅要求数组中的元素相同,而且元素的顺序也必须一致。如上文所示,有几种方法可以用来检查这种相等性。 - 使用`join('')`方法:将数组转换为字符串,然后比较字符串是否相等...
4. **交换操作**:在Java中,交换两个数组元素的位置可以通过一个临时变量实现。例如,交换`arr[i]`和`arr[j]`可以这样写: ```java int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; ``` 5. **输出过程**...
计算机软件及应用C语言之数组是编程学习中的基础概念,主要涉及如何定义、引用和操作数组。在C语言中,数组是一种数据结构,允许我们存储一组相同类型的数据。以下是关于数组的一些关键知识点: 1. **定义数组**: ...
- 在数组中找到最小(或最大)元素,存放到排序序列起始位置。 - 继续从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。 - 重复上述过程,直到所有元素均排序完毕。 Java实现示例: ```...
在Java中,链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的引用。对于本题,我们需要理解链表的基本操作,如遍历、创建新链表以及修改链表结构。具体来说,题目要求我们交换相邻的...
这个问题的基本需求是找到一个数组中的两个元素,使得它们的和等于一个特定的目标值。以下是对这个主题的详细解释: 首先,我们需要理解数组的概念。在JavaScript中,数组是一种数据结构,它可以存储一系列的值,...
在本压缩包“php-leetcode题解之两两交换链表中的节点.zip”中,包含的是关于使用PHP解决LeetCode算法题目的一个实例——“两两交换链表中的节点”。这个题目是LeetCode上的经典链表操作问题,旨在锻炼开发者对链表...
具体可以看这个连 https://blog.csdn.net/Li_haiyu/article/details/85469528 然后确定是否需要
* 一维数组选择排序:获取当前没有排好序中的最大元素和数组最右端的元素交换,循环这个过程即可实现对整个数组排序。 * 冒泡排序:依次两两比较排序元素,将带排序元素从左至右比较一遍称为一趟“冒泡”。 三、栈...
求绝对值最小数 FindMinDistance 求两元素最小距离 FindFirstIndex 找第一次出现位置下标 CombineAWithB 插入数成整体有序数组 FindSame 找出两有序数组交集 IsContinuous 判断数组中数值是否连续
它会遍历数组中的所有元素,并将它们两两比较,然后根据比较结果重新排列。比较函数通常有两个参数,代表被比较的两个元素。如果返回值小于0,那么第一个元素会被排在第二个元素之前;如果返回值大于0,则反之;如果...
1. **分组比较**:将数组中的元素两两分组,每组内的两个元素进行一次比较。 2. **选择最大值和最小值**:在每组内部,较大的元素将作为候选最大值,较小的元素则作为候选最小值。 3. **进一步筛选**:从所有候选...
- **算法题-3**:寻找数组中两两元素之差的绝对值最小值,可能涉及到排序或哈希表来优化搜索过程。 这些题目覆盖了计算机科学的核心内容,对考生的理论理解和实践能力都有较高要求。复习时,考生需要扎实掌握...
本文实例讲述了JS实现二维数组元素的排列组合运算。分享给大家供大家参考,具体如下: 用js实现二维数组里面的元素排列组合一个小demo; 源码: <!DOCTYPE ...
对于数组a[i]到a[j]的逆序对数量,可以通过查询树状数组c,得到区间内所有元素的两两之和,再减去区间内元素的总和的平方,得到逆序对数。这个过程可以使用前缀和和树状数组的查询功能来实现。 4. **C语言实现**: ...
书芯的制作在印刷行业中是一项重要的工艺步骤,它关乎到书籍的质量和耐用性。"两两胶合内页形成书芯的装置和形成方法"是一个专门针对这一环节的技术方案,旨在提高生产效率和产品质量。本技术主要关注的是如何将单个...
标题中的"GSE81558-3个分组两两之间差异分析-标准代码.gz"揭示了这是一个关于生物信息学研究的项目,具体来说,是基因表达数据的差异分析。GSE通常代表 GEO(Gene Expression Omnibus),这是一个由NCBI(美国国立...