数据结构练习(31)旋转数组的最小元素
旋转数组的最小元素(只针对单调增数组)
思路:
1. 如果 A[mid] < A[right] 则我们可以看出,右侧的数据是单调增的,所以最小值只能在 [left, mid] 区间内。
2. 如果 A[mid] > A[right] 则可以观察出来,左侧的数据是是单调增的,所以最小值只能在 [mid, right] 旋转区间内。
3. 如果 A[mid] == A[right] 则此时就要分情况讨论了,因为可能会同时存在 形如 {5, 3, 5, 5, 5} 和 {5, 6, 5, 5, 5}
两种情况下,无法确切推导出来最小值在左边还是右边,于是调用递归,分别求出左右侧的最小值输出即可。
int GetMinHelper(const int A[], int left, int right) { while (left + 1 < right) { int mid = left + (right - left) / 2; if (A[mid] < A[right]) { right = mid; } else if (A[mid] > A[right]) { left = mid; } else { int left_min = GetMinHelper(A, left, mid); int right_min = GetMinHelper(A, mid, right); return min(left_min, right_min); } } return min(A[left], A[right]); }
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步