微软一面笔试题 求数组中两个元素差的最大值(后面的元素减去前面的元素)O(N)时间复杂度O(1)空间复杂度
int max_difference(const vector<int>& arr){if (arr.size()>=2){int MIN=min(arr[0],arr[1]);int MAX_DIFFERENCE=arr[1]-arr[0];for (vector<int>::size_type i=2;i<arr.size();i++){if (arr[i]-MIN>MAX_DIFFERENCE){MAX_DIFFERENCE=arr[i]-MIN;}if (arr[i]<MIN){MIN=arr[i];}}return MAX_DIFFERENCE;}else{cout<<"size of arr is too small";return 0;}}void give_result(int a[],int n){vector<int> arr(a,a+n);print(arr.begin(),arr.end());print(max_difference(arr));}int main( void ) {int a0[]={7,9,10};give_result(a0,3);int a1[]={10,9,7};give_result(a1,3);int a[]={3,10,1,9};give_result(a,4);int a2[]={3,9,2,10,1,8};give_result(a2,6);return 0;}
其输出结果每两行作为一组,第一行为要考虑的数组的全部元素,第二行为其max_difference的结果。
陆陆续续的做了不少笔试题,也感觉收获很大,但毕竟做的不够,这个是第一个用已经掌握的技巧解决的。感觉算法强大!!
细心的读者还会发现,本文中的代码使用了vector的逆序迭代器。以前做过类似算法要求的遍历使用正向迭代器总感觉别扭,忽然想起了逆序迭代器。发现真的适合这种情形。