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

思路一

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

int getMinAbs(int[] num){//当数组只有一个元素的情况直接返回if(num.length == 1)return num[0];//当数组非负时直接返回num[0],当数组非正时直接返回num[num.length-1]if(num[0] >= 0)return num[0];else if(num[num.length-1] <= 0)return num[num.length-1];int min = Math.abs(num[0]);for(int i=1; i<num.length; i++)min = Math.min(min, Math.abs(num[i]));return min;
}

  

思路二

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

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

数组为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-low)/2,如果a[mid]*a[low] >=0说明a[mid]也为负数,缩小范围low=mid;如果a[mid]*a[high]>=0,说明a[mid]为正数,缩小范围high=mid。如果只剩两个元素,那么就比较他俩的绝对值,直接返回了绝对值小的数。
int getMinAbs(int[] num) {//当数组只有一个元素的情况直接返回if(num.length == 1)return num[0];//当数组非负时直接返回num[0],当数组非正时直接返回num[num.length-1]if(num[0] >= 0)return num[0];else if(num[num.length-1] <= 0)return num[num.length-1];//当数组有正有负时,返回最大的负数与最小的非负数中较小的那一个int low = 0, high = num.length-1, mid = (low + high)/2;while(low < high){if(num[mid] < 0)low = mid + 1;else if(num[mid] > 0){if(num[mid] * num[mid-1] < 0)return Math.min(Math.abs(num[mid-1]), num[mid]);high = mid - 1;}else return num[mid];mid = (low + high) / 2;}return 0;
}

  

转载于:https://www.cnblogs.com/lightwindy/p/9576619.html

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

  1. 如何求数组中绝对值最小的数?

    """ 有一个升序排列的数组,数组中可能有正数,负数或0,求数组中元素的绝对值最小的数.例如,数组[-10,-5,-2,7,15,50],该数组中绝对值最小的数是2 &q ...

  2. 找出有序数组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 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 【跟着我们学Golang】之异常处理
  2. 《构建之法》阅读笔记07
  3. sendto成功返回
  4. 订阅号助手App发布 手机也能管理公众号了
  5. MutationObserver详解
  6. Hadoop2.7.6在Windows7单机部署
  7. 嵌入式数据库SQLite的编译、安装和使用[ZT]
  8. java笔试完一般多久给通知_恭喜浙江,喜提浙江中烟招聘通知,一、二批共计招录130人左右...
  9. C++ 调用 SOAP Web Service
  10. python实现基于 Adaboost 框架来构建自定义集成模型【自定义基分类器模型】
  11. 大鹏教你python数据分析
  12. 程序发生run time error原因及解决方案
  13. python实现pdf合并
  14. python浙江医院抢号_医院挂号难?抢号秘籍看这里!
  15. Maye v1.3.4.0 类似Rolan简洁小巧易用的快速启动工具
  16. 计算机知识动画小学,电脑动画
  17. python的永久存储——pickle‘泡菜’ ,‘腌制’天气查询脚本
  18. Codeforces Beta Round #82 (Div. 2) C. Buns(多重背包)
  19. 虚拟机使用docker搭建Prometheus
  20. Mutiselect下拉复选框(保存和设置默认选中项)

热门文章

  1. EasyRecovery数据恢复(U盘)
  2. Linux Shell常用技巧(四) awk
  3. 函数开始处的MOV EDI, EDI的作用
  4. 验证码识别服务提供商
  5. Wordpress博客首页能打开 子页打不开解决办法
  6. CCCC-GPLT L3-013. 非常弹的球 团体程序设计天梯赛
  7. 蓝桥杯 ADV-176 算法提高 陶陶摘苹果
  8. 蓝桥杯 ADV-173算法提高 淘淘的名单
  9. android51版本小游戏,世界游戏大全51游戏下载-世界游戏大全51预约 安卓版v1.0.0-PC6手游网...
  10. AngularJS最理想开发工具WebStorm