找出有序数组中绝对值最小的元素
2014-08-26 17:56
309 查看
给定一个有序整数序列(非递减序),可能包含负数,找出其中绝对值最小的元素,比如给定序列 -5, -3, -1, 2, 8 则返回-1。
思路:
由于给定序列是有序的,而这又是搜索问题,所以首先想到二分搜索法,只不过这个二分法比普通的二分法稍微麻烦点,可以分为下面几种情况
如果给定的序列中所有的数都是正数,那么数组的第一个元素即是结果。
如果给定的序列中所有的数都是负数,那么数组的最后一个元素即是结果。
如果给定的序列中既有正数又有负数,那么绝对值得最小值一定出现在正数和负数的连接处。
代码如下:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define true 1
#define false 0
int SameSign(int a, int b)
{
if (a * b > 0)
return true;
else
return false;
}
// 找出一个非递减序整数序列中绝对值最小的数
int MinimumAbsoluteValue(int* a, int n){
// Only one number in array
if (n == 1)
{
return a[0];
}
// All numbers in array have the same sign
if (SameSign(a[0], a[n-1]))
{
return (a[0]>=0)? a[0] : a[n-1] ;
}
// Binary search
int l = 0 ;
int r = n-1 ;
while(l < r)
{
if (l + 1 == r)
{
return abs(a[l]) < abs(a[r]) ? a[l] : a[r] ;
}
int m = (l + r) /2 ;
if (SameSign(a[m], a[r]))
{
r = m;
}
else
{
l = m ;
}
}
return -1;
}
int main(int argc, const char * argv[])
{
int a[5] = {-3,-2,-1,5,6};
printf("%d\n",MinimumAbsoluteValue(a, 5));
return 0;
}
思路:
由于给定序列是有序的,而这又是搜索问题,所以首先想到二分搜索法,只不过这个二分法比普通的二分法稍微麻烦点,可以分为下面几种情况
如果给定的序列中所有的数都是正数,那么数组的第一个元素即是结果。
如果给定的序列中所有的数都是负数,那么数组的最后一个元素即是结果。
如果给定的序列中既有正数又有负数,那么绝对值得最小值一定出现在正数和负数的连接处。
代码如下:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define true 1
#define false 0
int SameSign(int a, int b)
{
if (a * b > 0)
return true;
else
return false;
}
// 找出一个非递减序整数序列中绝对值最小的数
int MinimumAbsoluteValue(int* a, int n){
// Only one number in array
if (n == 1)
{
return a[0];
}
// All numbers in array have the same sign
if (SameSign(a[0], a[n-1]))
{
return (a[0]>=0)? a[0] : a[n-1] ;
}
// Binary search
int l = 0 ;
int r = n-1 ;
while(l < r)
{
if (l + 1 == r)
{
return abs(a[l]) < abs(a[r]) ? a[l] : a[r] ;
}
int m = (l + r) /2 ;
if (SameSign(a[m], a[r]))
{
r = m;
}
else
{
l = m ;
}
}
return -1;
}
int main(int argc, const char * argv[])
{
int a[5] = {-3,-2,-1,5,6};
printf("%d\n",MinimumAbsoluteValue(a, 5));
return 0;
}
相关文章推荐
- 找出有序数组中绝对值最小的元素
- 找出有序数组中绝对值最小的数
- 面试题81:有序数组中绝对值最小的元素
- 找出有序数组中绝对值最小的数
- 找出有序数组中绝对值最小的数
- 找出有序数组中绝对值最小的数
- 找出有序数组中的绝对值的最小值
- 【算法】找出有序数组中,绝对值最小的一个(二分法)
- PHP实现找出有序数组中绝对值最小的数算法分析
- 每日一题(95) - 两个有序数组元素之积、和的最小K个值
- 求一个已排序的数组中绝对值最小的元素
- 寻找有序数组的反转数组中最小的元素
- 求升序数组中绝对值最小的元素
- 输入一个整数数组,返回所有元素两两之差绝对值最小的值,O(n)算法
- 找出和值等于指定值的元素,如有序数组{1,2,6,23,43,64},求和等于25的两个和数则将是元素2和23,时间复杂度是0(n)。
- 一个有序数组(从小到大排列),数组中的数据有正有负,求这个数组中的最小绝对值
- 数组最小(百度面试题目)对升序数组,求数组中绝对值最小的元素
- O(lgn)时间内找出有序数组中某个元素出现的次数
- 每日一题(28) - 找出绝对值最小的元素
- 线性时间内从一个数组中找出第K个最小的元素