求一个排序数组中绝对值最小的数

来源:互联网 发布:mac制作windows安装盘 编辑:程序博客网 时间:2024/06/10 07:47

题意描述:给定一个已排好序的数组,求数组中绝对值最小的元素

解题思路一:直接遍历,时间复杂度为O(n),求得数组中绝对值最小的元素

int getMinAbs(int[] num){//当数组只有一个元素的情况直接返回if(num.length == 1)return num[0];//当数组非负时直接返回num[0],当数组非正时直接返回num[num.length-1]if(num[0] >= 0)return num[0];else if(num[num.length-1] <= 0)return num[num.length-1];int min = Math.abs(num[0]);for(int i=1; i<num.length; i++)min = Math.min(min, Math.abs(num[i]));return min;}
解题思路二:直接遍历求最小的时间复杂度为O(n),并且也没有用到题目中给定的条件---已排序的数组。因此考虑到二分查找,最小的数应该是最大的负数与最小非负数之间绝对值较小的那个数
int getMinAbs(int[] num) {//当数组只有一个元素的情况直接返回if(num.length == 1)return num[0];//当数组非负时直接返回num[0],当数组非正时直接返回num[num.length-1]if(num[0] >= 0)return num[0];else if(num[num.length-1] <= 0)return num[num.length-1];//当数组有正有负时,返回最大的负数与最小的非负数中较小的那一个int low = 0, high = num.length-1, mid = (low + high)/2;while(low < high){if(num[mid] < 0)low = mid + 1;else if(num[mid] > 0){if(num[mid] * num[mid-1] < 0)return Math.min(Math.abs(num[mid-1]), num[mid]);high = mid - 1;}else return num[mid];mid = (low + high) / 2;}return 0;}



0 0
原创粉丝点击