上海标志设计公司上海品牌设计,网站建设优化解析,网站别人做的我自己怎么续费,网站建设前景如何搜索旋转排序数组
那……二分法呗 数组中的数可以相同 比 33. 搜索旋转排序数组 多了一个「有重复元素」#xff0c;导致无法根据 num nums[0] 来判断 num 在哪一半#xff0c;比如 [1,1,1,1,1,2,1,1,1] 旋转数组两头相等#xff0c;元素 1 可能在左半边可能在右半边 …搜索旋转排序数组
那……二分法呗 数组中的数可以相同 比 33. 搜索旋转排序数组 多了一个「有重复元素」导致无法根据 num nums[0] 来判断 num 在哪一半比如 [1,1,1,1,1,2,1,1,1] 旋转数组两头相等元素 1 可能在左半边可能在右半边 解决方法也很简单只要把「旋转数组两头相等」这种特殊情况排除掉就行了 排除掉旋转数组两头相等的情况后再像33一样判断从哪分 因为只旋转了一次所以数组分为两段两端分别是排序数组那么mid一定会落入其中一种排序好的数列里 如果mid比start大那么前一半是排序数组如果mid比end小那么后一半是排序数组 二分法的难点是代码的细节 以下引用自大佬的题解 第一类 1 0 1 1 1这种。此种情况下 nums[start] nums[mid]分不清到底是前面有序还是后面有序此时 start 即可。相当于去掉一个重复的干扰项。 第二类 2 3 4 5 6 7 1这种也就是 nums[start] nums[mid]。此例子中就是 2 5 这种情况下前半部分有序。因此如果 nums[start] targetnums[mid]则在前半部分找否则去后半部分找。 第三类 6 7 1 2 3 4 5这种也就是 nums[start] nums[mid]。此例子中就是 6 2 这种情况下后半部分有序。因此如果 nums[mid] targetnums[end]。则在后半部分找否则去前半部分找。 class Solution {
public:bool search(vectorint nums, int target) {int start0;int endnums.size()-1;int mid;while(startend){midstart(end-start)/2;if(nums[mid]target)return true;if(nums[start]nums[mid])start;else if(nums[start]nums[mid]){if(nums[start]targetnums[mid]target)endmid-1;else{startmid1;}}else{if(nums[end]targetnums[mid]target)startmid1;else endmid-1;}}return false;}
};