给出一个循环有序数组,与其姊妹篇不同的是其中允许元素出现重复多次。给定一个数字target,查找该数字是否存在于该数组中。
姊妹篇中的解决方法是使用折半查找,通过判断nums[left]和nums[mid]以及nums[right]与target的大小关系,然后对left,以及right这两个指针进行移动,直到left==right结束为止。
但是本题因为元素是可能重复的,因此在判断指针移动的过程中,无法确定移动的是哪一个指针。因此这里的方法上姊妹篇中的稍有差别。不过基础都是二分查找。
参考代码:
// // 1.cpp // test // // Created by PengFei_Zheng on 28/03/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include<iostream> #include<vector> using namespace std; class Solution { public: bool search(vector<int>& nums, int target) { int len = (int)nums.size(); int left = 0 ; int right = len-1; while(left<=right){ int mid = (left+right)/2; if(nums[mid]==target) return true; if(nums[left]<nums[mid]){ if(nums[left]<=target && target<nums[mid]) right=mid-1; else left=mid+1; } else if(nums[left]>nums[mid]){ if(nums[mid]<=target && target<nums[right]) left=mid+1; else right=mid-1; } else left++; } return false; } };
package leetcode_100; /*** * * @author pengfei_zheng * 循环有序可重复的数组中查找数字是否存在 */ public class Solution81 { public static boolean search(int nums[], int key) { int len = nums.length; int left = 0; int right = len - 1; while(left<=right){// enter the loop int mid = (left+right)/2; if(nums[mid]==key) return true;// find the target number if(nums[left]<nums[mid]){// if(nums[left]<=key && key < nums[mid]) right = mid-1; else left = mid+1; } else if(nums[left]>nums[mid]){ if(nums[mid] < key && key <= nums[right]) left = mid+1; else right = mid -1; } else left++; } return false; } }