剑指 Offer 11. 旋转数组的最小数字-7月22日
Posted boyscrytoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 11. 旋转数组的最小数字-7月22日相关的知识,希望对你有一定的参考价值。
题目
剑指 Offer 11. 旋转数组的最小数字
我的思路
显然用二分查找,时间复杂度logn,最坏情况可能达到n。
要注意二分查找的边界条件判断,以及如果无法判断此次二分是取左或者去右时,可以尝试把上边界下标减1,再重新二分(安全地缩小边界)。
我的实现
class Solution { public: int minArray(vector<int>& numbers) { int low = 0; int high = numbers.size()-1; int s; while(low!=high){ s = low + (high - low)/2; if(numbers[high]>numbers[low]) return numbers[low]; else if(numbers[high]<numbers[low]&&numbers[s]>=numbers[low]) low = s + 1; else if(numbers[high]<numbers[low]&&numbers[s]<=numbers[low]) high = s; else if(numbers[high]==numbers[low]){high--;} } return numbers[low]; } }; //二分查找 /* 先把两个指针low和high 指向数组首尾。若最小元素的指针(下标)是m,二分过程中的分界下标是s。 可能存在以下几种情况: 1.n[high]>n[low] return n[low] 2.n[high]<n[low] n[s]>=n[low] low = s+1 3.n[high]<n[low] n[s]<=n[high] high = s 4.n[high]==n[low] high--;//神来之笔,遇到无法判断二分到哪一边时,可以尝试直接把上边界象征性减小一点,重新判断 */
拓展学习
为什么官方的二分法的题解很多都是写的low + (high - low) // 2
而不是 (high + low) // 2?
(high + low) 在两者较大时会发生整型越界!
以上是关于剑指 Offer 11. 旋转数组的最小数字-7月22日的主要内容,如果未能解决你的问题,请参考以下文章