第81题:搜索旋转排序数组II

时间:2019-10-23
本文章向大家介绍第81题:搜索旋转排序数组II,主要包括第81题:搜索旋转排序数组II使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一. 问题描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。

编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

示例 1:

输入: nums = [2,5,6,0,0,1,2], target = 0

输出: true

示例 2:

输入: nums = [2,5,6,0,0,1,2], target = 3

输出: false

进阶:

这是 搜索旋转排序数组 的延伸题目,本题中的 nums  可能包含重复元素。

这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

二. 解题思路

解题思路:本题首先找到旋转点point,然后再进行二分查找。

步骤一:通过遍历数组找到旋转点point,判断target在point点左边还是右边。

步骤二:如果point在左边,则对左边进行二分查找。否则对右边进行二分查找。

注意:这一题的关键点是各种特殊情况需要考虑到.

三. 执行结果

执行用时 :1 ms, 在所有 java 提交中击败了99.84%的用户

内存消耗 :39.8 MB, 在所有 java 提交中击败了10.42%的用户

四. Java代码

class Solution {
   public boolean search(int[] nums, int target) {
       if(nums.length<=0||nums==null)
        {
            return false;
        }
        int point=0;
            for(int i=0;i<nums.length-1;i++)
            {
                if(nums[i]>nums[i+1])
                {
                    point=i+1;
                    break;
                }
            }
            //利用二分查找,找值
            int first=0;
            int second=nums.length-1;
        if(point>0)
        {
            if(target<=nums[point-1]&&target>=nums[0])
            {
                second=point-1;
            }else if(target<=nums[0]&&target>=nums[point])
            {
                first=point;
            }else
            {
                return false;
            }
        
        }  
        //二分查找代码
        do{
            if(target==nums[first]||target==nums[second])
            {
                return true;
            }
            int m=(first+second)/2;
            if(nums[m]==target)
            {
                return true;
            }else
            {
                if(nums[m]>target&&m>0)
                {
                    second=m-1;
                }else
                {
                    first=m+1;
                }
            }
        }while(second>first);
        
        return false;
            
        }
}

原文地址:https://www.cnblogs.com/xiaobaidashu/p/11725400.html