面试题81:有序数组中绝对值最小的元素

来源:互联网 发布:蜂巢网络与无人机战争 编辑:程序博客网 时间:2024/05/16 06:18

题目:

给定一个有序整数序列(非递减序),可能包含负数,找出其中绝对值最小的元素,比如给定序列-5、-3、-1、2、8则返回1。

思路:

由于是有序数组,而且是搜索问题,所以首先考虑二分查找法。

对于每个子数组,可以考虑一下几种情况:

1)如果给定的序列中所有的数都是正数,那么数组的第一个元素就是结果。

2)如果给定的序列中所有的数都是负数,那么数组的最后一个元素就是结果。

3)如果给定的序列中既有正数,又有负数,那么绝对值的最小值一定出现在正数和负数的分界处。


#include <iostream>#include <algorithm>using namespace std;const int N = 100;const int poolN = 3;bool SameSign(int m, int n){if ((m >> 31) == (n >> 31)) return true;return false;}int MiniNumAbsoluteValue(int *arr, int n){int low = 0;int high = n - 1;if (SameSign(arr[low], arr[high]))return arr[low] >= 0 ? arr[low] : arr[high];while (low < high){if (low + 1 == high) return (abs(arr[low] < abs(arr[high])) ? arr[low] : arr[high]);int mid = (low + high) >> 1;if (SameSign(arr[low], arr[mid]))//不用担心low到high全为正的情况,如果这样,则所有的都为正了{low = mid;continue;}if (SameSign(arr[mid], arr[high])){high = mid;continue;}}return arr[low];}int main(){int arr[] = { -5, -3, -1, 2, 8,9 };cout << MiniNumAbsoluteValue(arr, 6) << endl;return 0;}

0 0
原创粉丝点击