Fork me on GitHub

LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)

 
 
给出一个循环有序数组,与其姊妹篇不同的是其中允许元素出现重复多次。给定一个数字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;
    }
};
C++ Solution

 

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; 
    }
}
Java Solution

 

posted @ 2017-03-28 18:36  伊甸一点  阅读(230)  评论(0编辑  收藏  举报