【算法】在整数数组求中出两两之差绝对值最小的值
来源:互联网 发布:淘宝联盟用手机怎么做 编辑:程序博客网 时间:2024/06/07 03:29
这是一道微软的面试题,原题是这样的:
有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。(复杂度N^2则不得分)
解法一:看到这个这个题目第一个念头就是暴力解法,通过两个for循环两两相减,记录最小值即可:
int func(int* arr,int n){int nmin = abs(arr[0]-arr[1]);for(int i = 0; i < n-1; i++){for(int j = i+1; j < n; j++){int d = abs(arr[i]-arr[j]);if(d<nmin) nmin = d;}}return nmin;}这样对于我们来说肯定是最方便的也是最容易实现的,但是这样不符合要求,因为这个解法复杂度不符合要求。
解法二:先排序再查找相邻两个元素只差的绝对值,使用快速排序算法,复杂度可以降为O(nLogn):
//快速排序void q_sort(int* arr,int l,int r){if(l>=r) return;int low = l,high = r;int x = arr[l];while(low<high){while(low<high && arr[high]>x) high--;if(low<high) arr[low] = arr[high];while(low<high && arr[low]<=x) low++;if(low<high) arr[high] = arr[low];}arr[low] = x;q_sort(arr,l,low-1);q_sort(arr,low+1,r);}
int func(int* arr,int n){q_sort(arr,0,n-1);int nmin = abs(arr[0]-arr[1]);for(int i = 1; i < n-1; i++){int d = abs(arr[i]-arr[i+1]);if(d<nmin) nmin=d;}return nmin;}这个方法基本满足了题目的要求,但明显不适最好的解法,因为题目中强调并不需要求出是哪两个数,我们就假设肯定有最优解。
解法三:我们可以将问题进行一次改造,假设整数数组是a1,a2...an,我们可以通过引入辅助数组将计算任意两个元素只差转化为子段之和:
b1 = a1-a2
b2 = a2-a3
......
b(n-1) = a(n-1) - an
可以简单的推断出这样一个公式:ai - aj = bi+...+b(j-1)
这样就将问题简化为求一个整数数组的最小子段和的绝对值,也就是说子段和的绝对值最小。
还没有想出来......如果谁想出来了希望能够告诉我......
0 0
- 【算法】在整数数组求中出两两之差绝对值最小的值
- 整数数组中两两之差绝对值最小的值
- 整数数组中两两之差绝对值最小的值
- 输入一个整数数组,返回所有元素两两之差绝对值最小的值,O(n)算法
- 微软1 有一个整数数组,请求出两两之差绝对值最小的值
- 有一个整数数组,请求出两两之差绝对值最小的值
- 有一个整数数组,请求出两两之差绝对值最小的值(微软)
- 有一个整数数组,请求出两两之差绝对值最小的值
- 有一个整数数组,请求出两两之差绝对值最小的值
- 微软面试-101-有一个整数数组,请求出两两之差绝对值最小的值,
- 有一个整数数组,请求出两两之差绝对值最小的值
- 有一个整数数组,请求出两两之差绝对值最小的值
- 求数组两两之差绝对值最小的值
- 求出数组两两之差绝对值最小的值
- 求数组两两之差绝对值最小的值
- 求数组两两之差绝对值最小的值
- 求数组两两之差绝对值最小的值
- Microsoft笔试题--给定一维整数数组,找到数组里两两数之差绝对值最小的值
- DBCP连接池
- 初识App Inventor 2(AI2)
- 使QT内建的对话框文字显示为中文 window7+vs2010+qt
- 修改浏览器的User-Agent来伪装你的浏览器和操作系统
- (Google)TextView属性大全(API-16)
- 【算法】在整数数组求中出两两之差绝对值最小的值
- 关于javascript中apply()和call()方法的区别
- project config
- iOS Https
- 关于区别docuemnt.write()和document.getELementById().innerHTML=""
- Java 多线程同步的五种方法
- 【linq to sql学习笔记】增、删、改
- WebService 理解
- pdf如何修改错误