本文共 962 字,大约阅读时间需要 3 分钟。
旋转数组的最小值
在编程中,我们常常需要处理旋转数组的问题。旋转数组的定义是将数组的前若干个元素移动到数组的末尾。例如,数组{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,其最小值是1。
暴力做法的思路是从数组的末尾开始遍历,逐个检查每个元素是否是当前最小值。具体实现如下:
class Solution {public: int findMin(vector & nums) { if(nums.size()==0) return -1; int res=nums[nums.size()-1]; for(int i=nums.size()-2;i>=0;i--) if(nums[i]
这种方法的时间复杂度是O(n^2),因为需要遍历整个数组两次。虽然简单易懂,但在大规模数据面前效率较低。
二分法利用了数组的有序性质,通过查找找到旋转点,并在旋转点附近进行查找。具体实现如下:
class Solution {public: int findMin(vector & nums) { int n = nums.size() - 1; if (n < 0) return -1; while (n > 0 && nums[n] == nums[0]) n--; if (nums[n] >= nums[0]) return nums[0]; int l = 0, r = n; while (l < r) { int mid = l + r >> 1; if (nums[mid] < nums[0]) r = mid; else l = mid + 1; } return nums[r]; }}
这种方法的时间复杂度是O(log n),在大数据量下表现显著优于暴力做法。通过查找旋转点,减少了需要检查的范围,提高了效率。
转载地址:http://nefwz.baihongyu.com/