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

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

解题思路一:直接遍历,时间复杂度为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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值