• 第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;
                
            }
    }
  • 相关阅读:
    接口测试相关面试题
    appium报错 Unhandled rejection Error: UiAUtomator shut down unexpectedly
    几道小题
    element-ui select 二级联动
    pycharm 永久注册
    Python-二分法查找
    python3通过qq邮箱发送邮件
    IntelliJ IDEA常用快捷键总结
    IDEA工具开发一些辅助功能设置
    类百度富文本编辑器文件上传。
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/11725400.html
Copyright © 2020-2023  润新知