zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    链表数据-PHP的实现
    关于go的init函数
    socket小计
    很随笔
    go获取当前项目下所有依赖包
    关于synergy的问题
    二叉树的最大路径和
    大数求和
    重载<<运算符第二个参数必须加上const
    表达式求值
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/6636272.html
Copyright © 2011-2022 走看看