求排序数组的元素的绝对值的最小值
2014-10-24 14:15
696 查看
原文:http://blog.csdn.net/dengsi23/article/details/8039991
题目:一个有序数组(从小到大排列),数组中的数据有正有负,求这个数组中的最小绝对值。
思路:一个简单的思路,就是一次性遍历数组,求出数组的元素的绝对值的最小值,这样的时间复杂度为O(n)。但是,这样就浪费了题目的一个条件:数组是已经排好序的。所以,需要对原来的题目进行转换。考虑到数组有序,则元素绝对值的最小值为数组中最大负数的绝对值与最小非负数的绝对值的最小值。于是,题目事实上是去查找原数组中负数集合中的最大值。而在一个有序序列中进行查找,则优先考虑二分法,时间复杂度为O(log n)。
源码实现:
[cpp] view
plaincopy
int GetMinAbs(int* arr, int len)
{
int low, mid, high;
low = 0;
high = len - 1;
mid = (low + high) / 2;
while (low <= high)
{
if (mid == len - 1)
{
break;
}
else
{
int temp = arr[mid] * arr[mid + 1];
if (temp <= 0)
{
return abs(arr[mid]) < abs(arr[mid + 1]) ? abs(arr[mid]) : abs(arr[mid + 1]);
}
else
{
if (arr[mid] > 0)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
mid = (low + high) / 2;
}
}
if (arr[0] > 0)
{
return abs(arr[0]);
}
else
{
return abs(arr[len - 1]);
}
}
题目:一个有序数组(从小到大排列),数组中的数据有正有负,求这个数组中的最小绝对值。
思路:一个简单的思路,就是一次性遍历数组,求出数组的元素的绝对值的最小值,这样的时间复杂度为O(n)。但是,这样就浪费了题目的一个条件:数组是已经排好序的。所以,需要对原来的题目进行转换。考虑到数组有序,则元素绝对值的最小值为数组中最大负数的绝对值与最小非负数的绝对值的最小值。于是,题目事实上是去查找原数组中负数集合中的最大值。而在一个有序序列中进行查找,则优先考虑二分法,时间复杂度为O(log n)。
源码实现:
[cpp] view
plaincopy
int GetMinAbs(int* arr, int len)
{
int low, mid, high;
low = 0;
high = len - 1;
mid = (low + high) / 2;
while (low <= high)
{
if (mid == len - 1)
{
break;
}
else
{
int temp = arr[mid] * arr[mid + 1];
if (temp <= 0)
{
return abs(arr[mid]) < abs(arr[mid + 1]) ? abs(arr[mid]) : abs(arr[mid + 1]);
}
else
{
if (arr[mid] > 0)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
mid = (low + high) / 2;
}
}
if (arr[0] > 0)
{
return abs(arr[0]);
}
else
{
return abs(arr[len - 1]);
}
}
相关文章推荐
- 百度面试题:求一个已排序的数组中绝对值最小的元素
- 百度面试题:从已排序的数组中求绝对值最小的元素
- 求排序数组的元素的绝对值的最小值
- 百度面试题:求一个已排序的数组中绝对值最小的元素
- 求一个已排序的数组中绝对值最小的元素
- [经典面试题]排序数组中绝对值最小元素
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型数组排序,使得按序拼接数组各元素得到的值最小。
- 输出一个为递增排序数组的旋转数组中的最小元素――8
- 二分查找的一个题---找出排序数组中绝对值最小的数
- (百度面试题目)对升序数组,求数组中绝对值最小的元素
- 求数组中绝对值最小的元素
- 数组最小(百度面试题目)对升序数组,求数组中绝对值最小的元素
- 微软面试:输出整型数组任意两个元素差的绝对值的最小值
- 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组
- 【C语言】求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素
- 已知元素从小到大排列的两个数组x[]和y[],请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个,这叫做数组的距离
- 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小。
- 整数数组排序--各个元素拼接所得结果最小