找出有序数组中绝对值最小的数
来源:互联网 发布:linux tmp目录 编辑:程序博客网 时间:2024/05/19 05:01
假设数组是从小到大排序,数值可能为负数、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 <iostream>#include <cmath>using namespace std;int absMin(int *a, int size){ 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 < 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; } }}int main(){ int arr1[] = {-8, -3, -1, 2, 5, 7, 10}; size_t size1 = sizeof(arr1) / sizeof(int); int minabs1 = absMin(arr1, size1); cout << "Result:" << minabs1 << endl; int arr2[] = {-8, -3, 2, 5, 7, 10}; size_t size2 = sizeof(arr2) / sizeof(int); int minabs2 = absMin(arr2, size2); cout << "Result:" << minabs2 << endl;}
结果
复杂度分析
时间复杂度O(log2n),空间复杂度O(1).
===========================================
改进1:完全可以把这些特例(size=1、同号,放到while循环里)
============================================
int absMin(int *a, int size){ 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
因此只需比较边上的两个值的绝对值大小,方可揭晓答案。
分类: 算法&&数据结构
0 0
- 找出有序数组中绝对值最小的数
- 找出有序数组中绝对值最小的元素
- 找出有序数组中绝对值最小的元素
- 找出整数数组中两个数差值的绝对值最小
- 找出整数数组中两个数差值的绝对值最小
- 二分查找的一个题---找出排序数组中绝对值最小的数
- 找出有序数组中的绝对值的最大值
- 面试题81:有序数组中绝对值最小的元素
- 有序数组最小绝对值。
- 有序数组中绝对值不同的数的个数
- 求一个排序数组中绝对值最小的数
- 【EMC笔试题】N个整数中找出三个数,使其和的绝对值最小
- 在一个旋转有序数组中,查找最小的数
- 从数组中找出最大的和最小的数
- 求数组中绝对值最小的元素
- 找出有序数组中和等于指定数的两个数
- 【数学】找出若干个有序数组的最小距离
- 给出一个数和一个有序数组,找出该数组中之和等于该数的两个数
- Java IO RandomAccessFile随机读写文件用法
- Linux工程构建工具
- 一个判断session是否过期的小技巧
- UVa-11234-Expressions
- 连个队列实现一个栈
- 找出有序数组中绝对值最小的数
- Coin Change+uva+dp
- Think in AngularJS:对比jQuery和AngularJS的不同思维模式
- scrollview之contentOffset
- vpn原理及实现--隧道的一种实现
- 正则表达式验证工具类RegexUtils.java
- 【Game】暗黑玩家:是什么让我的暗黑3变成这样了
- 抽象工厂模式
- oracle in与exists的使用