【每日一题】递增序列中绝对值最小的数

题目描述
给定一个递增数组,求其中绝对值最小的那个数。
如给定数组为:-8, -5, -2, 3, 5, 7,则返回-2

思路
因为数组是递增序列,所以求绝对值最小的数只可能是位于正负边界的两个数之一,因此对于数组中同时存在正数和负数的情况,可以采用类似二分查找的方法,如果low和mid同号,那么那个绝对值最小的数一定在右侧,将low的值改为mid;如果low和high同号,那么绝对值最小的数一定在左侧,将high改为mid,也就是说,对于数组中有正有负的,一定是往趋向于零的方向找,最后low和high连续时,只要比较这两个数的绝对值就行了。最后,若数组都是正数或者都是负数时,可以直接取到绝对值最小的数。

代码


public static void main(String[] args) {
        int[] a = {-8, -5, -2, 3, 5, 7};
        System.out.println(absMin(a, 6)); //运行输出-2
}

public static int absMin(int[] a, int size) {
        if(size == 1)
            return a[0];
        //考虑数组都是正数或者都是负数的情况
        if(a[0] * a[size-1] >= 0)
            return (a[0] >= 0) ? a[0] : a[size-1];
        else
        {
            int low = 0, high = size-1, mid = 0;
            while(low < high)
            {
                //当两个数临近时,直接取绝对值小的那个数
                if(low + 1 == high)
                    return Math.abs(a[low]) < Math.abs(a[high]) ? a[low] : a[high];
                mid = low + (high - low) / 2;
                //左边同号时(必然都是负数(或者一个零),往右边找)
                if(a[low] * a[mid] >= 0)
                    low = mid;
                //右边同号时(必然都是正数(或者一个零),往左边找)
                if(a[high] * a[mid] >= 0)
                    high = mid;
            }
            return a[mid];
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值