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到10000,求其中出现次数最多的数。
行业分类-设备装置-两两胶合内页形成书芯的装置和形成方法.zip
行业分类-设备装置-两两胶合页面形成书芯的生产线
GSE81558-3个分组两两之间差异分析-标准代码.gz
求绝对值最小数 FindMinDistance 求两元素最小距离 FindFirstIndex 找第一次出现位置下标 CombineAWithB 插入数成整体有序数组 FindSame 找出两有序数组交集 IsContinuous 判断数组中数值是否连续
具体可以看这个连 https://blog.csdn.net/Li_haiyu/article/details/85469528 然后确定是否需要
1.2 应用冒泡排序算法实现数组元素排序的 Java 程序实现示例 1.2.1 在 MyEclipse 开发工具中创建 Java 工程项目 1、启动 MyEclipse 开发工具,并选择 Java Project 工程项目 杨教授工作室 精心创作的优秀程序员 ...
matlab 二维插值计算matlab 二维插值计算
本文实例讲述了JS实现二维数组元素的排列组合运算。分享给大家供大家参考,具体如下: 用js实现二维数组里面的元素排列组合一个小demo; 源码: <!DOCTYPE ...
# 将第一个节点指向第三个节点# 第二个节点指向第一个节点# 节点first指向第二个节点# 当前节点后移动,记得a.next是节点3,相当于跳了一个节点,往后
第1题:从数组a中删除所有在数组b中出现过的元素。对于上例来说,a删除结束应该等于 [5, 6, 7]. 第2题:实现 c = a – b , c应该等于[3, 4, 5, 6, 7]. 先看第1题: 常规的思维大致会这么写代码: for i in a: if...
用成员函数重载运算符“+”和“-”,将两个二维数组相加和相减。要求第一个二维数组的值由构造函数设置,另一个二维数组的值由键盘输入。
免费分享~用java编写的聊天程序,具有聊天界面,可以实现两两之间的对话。使用GUI和socket以及多线程,聊天软件是学习java的一个极好的练手工具。
但是内层循环的结束条件i<array.length-1-i,这里一定要-1,原因很简单,因为在内层循环中分表使用i和i+1作为索引获取数组的元素,就要保证i和i+1都不能超出数组的索引范围,即i推导出i<array.length-1.最后的-i只是为了...
依次比较数组中相邻两个元素大小,若 a[j] > a[j+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后 重复以上步骤,直到整个数组有序 优化方式: 每轮冒泡时,最后一次交换索引可以作为...
js代码-(算法)(数组)两数之和等于目标数
本程序基本实现了小游戏连连看的功能,玩家找出游戏中2个相同图案的方块,如果它们之间的连接线不多于3根直线,则将其连接起来,就可以成功将图案相同的方块消除,否则不会消失,当游戏中已没有满足条件的图案时,...
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 ''' class ListNode(object): def __init__(self, x): self.val = x self.next =...
想法:大减小 大赢 最小减最大 最小赢(所有克制类游戏) 写完思路之后,再查找哪些是全局变量,来定义变量类型。 尽量少使用if和else,因为每次都会走一遍if,可以用switch替换。
Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 JS解释器/引擎 是JS的运行环境: 1、独立安装的JS解释器 - NodeJS 2、嵌入在浏览器中的JS解释器 JS的发展史: 1、1992年 Nombas 开发...