【题目】
题目为:
有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现
例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。
|
【分析】
给定数组是已经排好序的,且是升序,没有重复元素。
一个简单的思路,就是一次性遍历数组,求出数组的元素的绝对值的最小值,这样的时间复杂度为O(n)。
但是,这样就浪费了题目的一个条件:数组是已经排好序的。所以,需要对原来的题目进行转换。考虑到数组有序,利用二分查找原理。
求数组中绝对值最小的元素,与0离得最近绝对值越小。基于这个原理设计代码。
分三种情况:
(1)如果全是正数,返回第一个元素值。if(A[0] >= 0)
(2)如果全是负数,返回最后一个元素值。if(A[n-1] <= 0)
(3)有正有负,利用二分查找找到0的插入位置,如果正好找到0的位置,0就是绝对值最小的元素,
如果没有找到0,插入位置的左右元素比较绝对值大小 ,返回较小者OK。
【代码】
/*********************************
* 日期:2015-01-29
* 作者:SJF0115
* 题目: 排序数组中绝对值最小元素
* 来源:百度
* 博客:
**********************************/
#include <iostream>
#include <algorithm>
using namespace std;
int MinAbs(int A[],int n){
if(n == 1){
return A[0];
}//if
// 只有正数
if(A[0] >= 0){
return A[0];
}
// 只有负数
if(A[n-1] <= 0){
return A[n-1];
}
// 找到0的插入位置
int target = 0;
int left = 0,right = n - 1;
int mid;
while(left <= right){
mid = left + (right - left) / 2;
// 中间元素等于目标
if(A[mid] == target){
return A[mid];
}
// 目标在左半部分
else if(A[mid] > target){
right = mid - 1;
}
// 目标在右半部分
else{
left = mid + 1;
}
}//while
// 绝对值最小
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<<MinAbs(A,n)<<endl;;
return 0;
}
分享到:
相关推荐
本文实例讲述了PHP实现找出有序数组中绝对值最小的数算法。分享给大家供大家参考,具体如下: 问题: 一个有序数组,值有可能有负值,也有可能没有,现需要找出其中绝对值最小的值。 方法1: 遍历数组,找到绝对值...
C语言实验 C语言实验 C语言实验 C语言实验 绝对值最大数字 大一上学期课堂练习
二维数组中的查找,逐行扫描,行内使用二分查找。最差情况需要扫描所有行,待完善
public class exercessinto { byte y; double sum;... public void juedui(byte x)//<一>byte绝对值问题 { y=(byte)Math.abs(x); System.out.println("byte类型的数字的绝对值为:"+y); }
按照绝对值从大到小排序后输出.cpp
算法提高 数组输出 时间限制:1.0s 内存限制:512.0MB 输入一个3行4列的数组,找出该数组中绝对值最大的元素、输出该元素及其两个下标值
囊括网上的大部分嵌入式面试及笔试题,绝对受用!
返回输入矩阵“ A”中具有最大abs值的元素的值。 输入“A”必须是数字,但可以是任何大小和形状。 这很有用,因为它消除了对矩阵所有维度的迭代。 例子: A=[-5 3 2 3; 3 2 1 4]; absmax(A) 将返回 -5 A=[643,10]...
数据结构教程(JAVA语言描述) 求一个含有n个整数元素的数组a[0..n-1]中的最大元素,有这样一种思路:先比较第一个元素,再比较第二个元素,比较过程向中间靠近
(4)查找数组中最小元素,绝对值最大元素,排序数组。 要求菜单提示选择,调试查看运行结果 二、对于100以内的整数判断是否是素数,如果是素数,十进制形式输出,每行输出10个数。 三、计算输入的两个数的最小公...
【免费题库】华为OD机试 - 两数之和绝对值最小(Java & JS & Python & C & C++).html
http://acm.hdu.edu.cn/showproblem.php?pid=2020 绝对值排序 txt格式
绝对值经典练习题.docx
vc6.0建的工程,包括基础篇的大多数的题目,绝对是很有价值的东西,欢迎大家下载
2.已知元素从小到大排列的两个数组x[]和y[],请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个,这叫做数组的距离。 3.输入一个英文句子,将每个单词的第一个字母改成大写字母。 4、输入两个正整数,输出...
题目描述 将一个按照升序排列的有序数组,转换为...一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 将有序数组转换为二叉搜索树的结果肯定是不唯一的,因为存在多种建树方法。
2014贵州教师资格证面试初中数学“绝对值”说课稿.pdf
包含全部代码以及课设报告
设是实对称矩阵的任一特征值,为对应的特征向量,则有。由向量范数、矩阵的相容性得: 上式对任何一种算子范数都成立,当取矩阵的行范数就是的每行元素的绝对值之和的最