大佬教程收集整理的这篇文章主要介绍了求解旋转数组的最小数字,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
求解旋转数组的最小数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小数组。例如数组{3,4,5,1,2}是数组{1,2,3,5}的旋转数组,该数组的最小值为1。
思路解析:
O(N)的算法
这种算法的思想就是遍历这个数组,由于这个数组是两部分有序的数组,因此遍历这个数组时当后一个数字小于前一个数字时,则后一个(即较小)一定为整个数组中最小的数字。
这种算法的思想很简单,但就是时间复杂度较大,因此不是很好的算法。
int minnumberInRotateArray(vector<int> rotateArray) { if (rotateArray.empty()) return -1; unsigned int i=0; for (; i<rotateArray.size()-1; i++) { if (rotateArraY[i] > rotateArraY[i+1]) break; } return rotateArraY[i+1]; }
O(logN)的算法
这种算法思想类似于二分查找,首先每次找到数组中中间的数字mID,如果mID大于最左端left,说明最小数在mID的右侧区间,则改变left,置left为mID;如果mID小于数组右侧right,说明最小数在mID的左侧区间,则改变right为mID….当left的数字小于等于right的数字时,说明已经找到最小数,这个也是循环结束的条件
int minnumberInRotateArray(vector<int> rotateArray) { if (rotateArray.empty()) return -1; unsigned int left=0; unsigned int right=rotateArray.size()-1; unsigned int mID=left; while (rotateArraY[left] >= rotateArraY[right]) { if (right-left == 1) { mID = right; break; } mID = left+((right-left)>>1); if (rotateArraY[R_729_11845@ID]==rotateArraY[left] && rotateArraY[right]==rotateArraY[R_729_11845@ID]) return rotateArraY[R_729_11845@ID]; if (rotateArraY[R_729_11845@ID] >= rotateArraY[left]) left = mID; else if (rotateArraY[R_729_11845@ID] <= rotateArraY[right]) right = mID; } return rotateArraY[R_729_11845@ID]; }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
以上是大佬教程为你收集整理的求解旋转数组的最小数字全部内容,希望文章能够帮你解决求解旋转数组的最小数字所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。