假设数组是从小到大排序,数值可能为负数、0、正数。

思路一

可以一次性遍历一遍,找出绝对值最小值,此时时间复杂度为O(N),缺点是没有利用数组是有序的这一特点。

思路二

数组有序,可以利用二分查找的特性。中间的数是正数,往后找;中间的数是负数,往前找。

问题的本质是找到正数的最小值,或负数的最大值,分析以下集中情况

数组为a[], 数组大小为n.

n=1,没有商量的余地,直接返回

a[0] * a[n-1] >= 0,说明这些元素同为非正或同为非负。要是a[0]>=0,返回a[0];否则返回a[n-1]

a[0] * a[n-1] < 0,说明这些元素中既有整数,也有负数。此时需要计算中间位置为mid = low + high/2,如果a[mid]*a[low] >=0说明a[mid]也为非正,缩小范围low=mid;如果a[mid]*a[high]>=0,说明a[mid]非负,缩小范围high=mid。在期间如果还有两个元素,那么就比较以下他俩,直接返回了

参考代码

#include #include

using namespacestd;int absMin(int *a, intsize)

{if(size == 1)return a[0];if(a[0] * a[size-1] >= 0)return (a[0] >= 0) ? a[0] : a[size-1];else{int low = 0, high = size-1, mid;while(low

{if(low + 1 ==high)return abs(a[low]) < abs(a[high]) ?a[low] : a[high];

mid= low + (high - low) / 2;if(a[low] * a[mid] >= 0)

low=mid;if(a[high] * a[mid] >= 0)

high=mid;

}

}

}intmain()

{int arr1[] = {-8, -3, -1, 2, 5, 7, 10};

size_t size1= sizeof(arr1) / sizeof(int);int minabs1 =absMin(arr1, size1);

cout<< "Result:" << minabs1 <

size_t size2= sizeof(arr2) / sizeof(int);int minabs2 =absMin(arr2, size2);

cout<< "Result:" << minabs2 <

}

结果

复杂度分析

时间复杂度O(log2n),空间复杂度O(1).

===========================================

改进1:完全可以把这些特例(size=1、同号,放到while循环里)

============================================

int absMin(int *a, intsize)

{int low = 0, high = size-1, mid;while(low <=high)

{if(a[low] * a[high] >= 0)return (a[low] >= 0) ?a[low] : a[high];if(low + 1 ==high)return abs(a[low]) < abs(a[high]) ?a[low] : a[high];

mid= low + (high - low) / 2;if(a[low] * a[mid] >= 0)

low=mid;if(a[high] * a[mid] >= 0)

high=mid;

}

cout << "ERROR, size <= 0" << endl;return -1; //size <= 0

}

拓展

有序(自小到达)绝对值最大呢?

如果有整数、0、负数的话,绝对值最小值在相对中间部位。但是如果求绝对值最大,绝对在两边,例如

1 2 3 4

-4 -3 -2 -1

-4 -2 0 1 2

因此只需比较边上的两个值的绝对值大小,方可揭晓答案。

python 绝对值最小值的 正数_找出有序数组中绝对值最小的数相关推荐

  1. 找出有序数组中绝对值最小的数

    假设数组是从小到大排序,数值可能为负数.0.正数. 思路一 可以一次性遍历一遍,找出绝对值最小值,此时时间复杂度为O(N),缺点是没有利用数组是有序的这一特点. int getMinAbs(int[] ...

  2. 典型的Top K算法_找出一个数组里面前K个最大数

    原文 典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入 ...

  3. c语言找出一个数组中出现次数最多的那个元素,c语言找出数组中出现次数最多地那个元素...

    matlab中如何找出不同维度矩阵出现次数最多的数组并记录其个数 首先是胞矩阵中的序列问题,不妨假设AA{1}是一个多行两列的数据,AA{2}同例.程序如下clcclearallAA{1}=[12;2 ...

  4. 找出一个数组中出现次数最多的那个元素

    Description 找出一个数组中出现次数最多的那个元素 Input 多组输入,请处理到文件结束 每组第一行输入一个整数n(不大于20) 第二行输入n个整数 Output 找出n个整数中出现次数最 ...

  5. 找出有序数组X和Y中所有元素的中位数(X,Y分别含n个元素)(算法导论第三版9.3-8)

    找出有序数组X和Y中所有元素的中位数(X,Y分别含n个元素) (算法导论第三版9.3-8) 时间复杂度O(lgn) int find_median_two_ordered_arrays(int *ar ...

  6. 找出一个数组中唯一一个出现2次的数字

    找出一个数组中唯一一个出现2次的数字,不清楚是不是LeetCode上的题.本人默认是LeetCode上的题. 一个数组中有N个数字,但是只有一个数字出现了2次,其他的数字均不相同.这种问题一般应该采用 ...

  7. 如何快速找出一个数组中最大数和第二大数

    看到一道题是:快速找出一个数组中最大数和第二大数. 我之前学了一些数组排序,例如冒泡排序,简单选择排序等等,然后我就想可不可以利用冒泡排序来实现呢?之前写过冒泡排序实现从小到大的排列,那么可以改成从大 ...

  8. 快速找出一个数组中的最大数、第二大数

    http://blog.csdn.net/hackbuteer1/article/details/8035261#comments 快速找出一个数组中的最大数.第二大数 思路:如果当前元素大于最大数 ...

  9. 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值

    我觉得写得很清晰,希望没有侵犯作者的著作权,原文地址http://blog.csdn.net/hackbuteer1/article/details/6699642 快速找出一个数组中的两个数字,让这 ...

  10. [基础题]1.快速找出一个数组中的最大数、第二大数。

    [基础题]1.快速找出一个数组中的最大数.第二大数. package HomeWork_10;public class Test_01 {public static void main(String[ ...

最新文章

  1. apply call bind 简介
  2. 浪潮各机型前面板指示灯含义
  3. dart参数传方法_Flutter必备Dart语言快速入门
  4. [高光谱] Hyperspectral-Classification-master 网络模型解析
  5. laravel nginx_在nginx上用FastCGI解析PHP
  6. 简库软件库工具箱综合源码_iApp源码
  7. LAMP兄弟连PHP高薪就业班2012召集令
  8. 数据结构课程设计- (二) 栈与队列(迷宫问题)
  9. EPlan 下载和破解
  10. 小米路由php5.6,MT7621超频1100Mhz,带小米路由器3G/小米AC2100/红米AC2100固件下载
  11. 汽车CAN 总线系统原理设计与应用 (一)
  12. python实战 爬取网易云评论信息
  13. 数字+字母+特殊字符 的正则表达式
  14. 电子扫描件怎么弄?这个方法值得了解
  15. ABAP调用外部webservice 问题
  16. 安卓Android校园综合服务系统校园帮app
  17. 8-四平方和定理(拉格朗日定理)
  18. FCC TributePage
  19. 思杰pvs服务器压力无法最大化,Windows Server 2008 Hyper-V上运行思杰XenDesktop之最优范例...
  20. 微软研究院洪小文:人工智能到底是个什么东西?我们应该怎样看待它?

热门文章

  1. 中文汉字转拼音首字母大写
  2. 慢就是快的人生哲理_感悟人生:慢是一种心态
  3. 竖流式沉淀池集水槽设计计算_竖流沉淀池设计计算书.
  4. python里offset啥意思_深度理解Jquery 中 offset() 方法
  5. web个人学习笔记(待完善)
  6. BLE射频杂散源的由来,以及常见处理办法
  7. 结算系统功能详解-上篇
  8. 同步锁Synchronized和ReentrantLock区别
  9. 单阶段目标检测算法YOLOv3
  10. mysql远程操作权限(navicat for mysql)