如何求绝对值最小的数

1.问题描述

​ 有一个升序排列的数组,数组中可能有正数,负数或0,求数组中元素的绝对值最小的数,例如,数组{-10,-5,-2,-7, 15 , 50}绝对值最小的是-2

2.解题分析

​ 求数组最小的绝对值,分为三种情况:

  1. 数组全是负数绝对值最小的一定是最后一个数

  2. 数组全是正数即第一个数为非负数,那么绝对值最小的一定是第一个数

  3. 数组即有正数又有负数时,首先找到正数与负数的分界点,如果分界点恰好为0,那么0就是绝对值最小的数。否则就要通过比较分界点左右的正数和负数的绝对值来确定最小的数。

    那么如何来查找正数与负数的分界点呢?最简单的方法仍然是顺序遍历数组,找出第一个非负数(前提是数组中既有正数又有负数),接着通过比较分界点两个数的值来找出绝对值最小的数。这种方法在最坏的情况下时间复杂度为0(n)。下面主要介绍采用二分法来查找正数与负数的分界点的方法。其主要思路为:取数组中间位置的值a[ mid]。①a[ mid]=0,那么这个数就是绝对值最小的数;②a[ mid]>0,如果a[mid-1]<0, 那么就找到了分界点,通过比较a[ mid]与a[ mid -1 ]的绝对值就可以找到数组中绝对值最小的数,如果a[ mid -1]=0,那么a[ mid-I]就是要找的数,否则接着在数组的左半部分查找;③a[ mid] <0,如果a[ mid+1]>0,那么通过比较a[mid]与a[ mid +1]的绝对值即可,如果a[ mid+1]=0,那么a[ mid +1]就是要查找的数,否则接着在数组的右半部分继续查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

public class 如何求绝对值最小的数 {
public static int getMinAbsoluteValue(int []a){
if(a==null){
return Integer.MIN_VALUE;
}
int len=a.length;
if(len<1){
return Integer.MIN_VALUE;
}
if(a[0]>=0){
return a[0];
}
if(a[len-1]<0)
return a[len-1];

int mid=0;
int end=len-1;
int start=0;
int absmin=0;
while(true){
mid=start+(end-start)/2;
if(a[mid]==0){
return 0;
}
else if(a[mid]>0){
if(a[mid-1]>0)
end=mid-1;
else if(a[mid-1]==0)
return 0;
else
break;

}else{
if(a[mid+1]<0)
start=mid+1;
else if(a[mid+1]==0)
return 0;
else
break;

}

}
if(a[mid]>0){
if(a[mid]<Math.abs(a[mid-1]))
absmin=a[mid];
else{
absmin=a[mid-1];
}

}else{
if(Math.abs(a[mid])<a[mid+1])
absmin=a[mid];
else{
absmin=a[mid+1];
}

}
return absmin;
}
public static void main(String[] args) {
int []a=new int[]{-10,-5,-3,2,5,7,8};
System.out.println(getMinAbsoluteValue(a));
int []a1=new int[]{0,1,2,3,4,5};
System.out.println(getMinAbsoluteValue(a1));
int []a2=new int[]{-7,-6,-4,-3,-2,-1};
System.out.println(getMinAbsoluteValue(a2));
}




}
-------------本文结束感谢您的阅读-------------
0%