排序的数组中找绝对值最小数

分三种情况:
case 1:如果全是正数,返回第一个元素值。
case 2:如果全是负数,返回最后一个元素值。
case 3:有正有负,充分利用给定的条件——已排序的数组。因此考虑二分查找,找到 0 的插入位置,如果正好找到 0,0 就是绝对值最小的元素;如果没有找到 0,插入位置的左右元素比较绝对值大小 ,返回较小者就 OK 了。

#include   
#include   
using namespace std;  
  
int MinAbs(int A[], int n) {  
    if(n == 1){  
        return A[0];  
    } 
    // case 1:如果全是正数,返回第一个元素值
    if(A[0] >= 0){  
        return A[0];  
    }  
    // case 2:如果全是负数,返回最后一个元素值  
    if(A[n-1] <= 0){  
        return A[n-1];  
    }  
    // case 3:有正有负,二分查找 
    int target = 0;  
    int left = 0, right = n - 1;  
    int mid;  
    while(left <= right){  
        mid = left + (right - left) / 2;  
        // 若中间元素等于目标 0, 最小绝对值就是 0  
        if(A[mid] == target){  
            return A[mid];  
        }  
        // 目标在左半部分  
        else if(A[mid] > target){  
            right = mid - 1;  
        }  
        // 目标在右半部分  
        else{  
            left = mid + 1;  
        }  
    }
    // 绝对值最小  
    if(abs(A[left]) < abs(A[right])){  
        return A[left];  
    }  
    return A[right];  
}  
  
int main() {  
    //int A[] = {-6, -5, -4, -3, -2, -1};  
    //int A[] = {-6, -5, -4, 1, 2, 3};  
    //int A[] = {1, 2, 3, 4, 5, 6};  
    int A[] = {-20, -13, -4, 6, 77, 200};  
    int n = 6;  
    cout<

你可能感兴趣的:(排序的数组中找绝对值最小数)