寻找一个绝对值最小的数,是一个不太常见但却异常适用的问题。这个问题在数学中有许多应用,好比求出一个数组中绝对值最小的元素,或者求出多个函数中绝对值最小的函数等等。下面我们就先容几种解法:
解法一:暴力枚举
暴力枚举是最简朴的一种方式:遍历整个数组,对于每个元素盘算它的绝对值,然后和已知的最小值对照,若是更小就更新最小值:
int findMinAbsolute(int[] nums) { int min = Integer.MAX_VALUE; for (int i = 0; i < nums.length; i ) { int absVal = Math.abs(nums[i]); if (absVal < min) { min = absVal; } } return min;}
这种方式异常简朴,然则时间庞大度是O(n),不太适合处置大规模数据。
解法二:排序
将数组排序后,最小的绝对值一定在相邻的两个元素之间发生。因此,只需对相邻的元素盘算绝对值,然后找到最小的即可:
int findMinAbsolute(int[] nums) { Arrays.sort(nums); int min = Math.abs(nums[0] - nums[1]); for (int i = 1; i < nums.length - 1; i ) { int absVal = Math.abs(nums[i] - nums[i 1]); if (absVal < min) { min = absVal; } } return min;}
这种方式的时间庞大度是O(n log n),适合处置中等规模数据。
解法三:二分查找
二分查找是在有序序列中查找某个元素的一种算法。在这个问题中,我们可以对数组举行排序,然后找到距离0最近的元素(可以使用二分查找),这个元素就是绝对值最小的数。
int findMinAbsolute(int[] nums) { Arrays.sort(nums); int lo = 0, hi = nums.length - 1; while (lo < hi) { int mid = (lo hi) / 2; if (nums[mid] < 0) { lo = mid 1; } else { hi = mid; } } return Math.min(Math.abs(nums[lo]), Math.abs(nums[lo-1]));}
这种方式的时间庞大度是O(n log n),然则比解法二要好一些,适合处置大规模数据。
总结
以上三种方式都可以用来寻找绝对值最小的数,差异的方式适用于差异规模的数据。若是数据量很大,应该使用第三种方式;若是排序的价值过高或者数据量较小,应该使用第一种或第二种方式。