zoukankan      html  css  js  c++  java
  • Leet Code 33.搜索旋转排序数组

    题目

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

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

    搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1。

    你可以假设数组中不存在重复的元素。

    你的算法时间复杂度必须是O(logn) 级别。

    思路

    由于时间复杂度的限制,可以想到需要使用二分查找。

    整个数组只保持了局部有序。通过观察,可以发现,我们可以通过判断mid位置、最左位置和最右位置的大小关系,来分辨出target应该在哪一边,以此来达到二分查找的选边。

    通过旋转,有两个局部升序数组,我们将mid的数与len比较,如果大于,则左边是有序的。将mid的数与right比较,如果小于,则右边是有序的。
    同时,判断目标值是不是在这个有序数组中,若在,这减小搜索范围,不在,则到另一边继续用相同策略搜索。

    这道题关键的一点是,right的值一定小于left的值

    代码

    class Solution {
        public int search(int[] nums, int target) {
            if (nums.length == 0) return -1;
            int i = 0, j = nums.length - 1;
            while(i <= j) {
                int mid = (i + j) / 2;
                if (nums[mid] == target) return mid;
                
                if (nums[mid] >= nums[i]) {
                    if (nums[i] <= target && nums[mid] > target) {
                        j = mid - 1;
                    }
                    else {
                        i = mid + 1;
                    }
                }
                else if (nums[mid] <= nums[j]) {
                    if (nums[mid] < target && nums[j] >= target) {
                        i = mid + 1;
                    }
                    else {
                        j = mid - 1;
                    }
                }
            }
            return -1;
        }
    }
    
  • 相关阅读:
    python 日期、时间戳转换
    判断任意数字是否为素数
    linux使用工具记录
    python日志记录-logging模块
    python特性、属性以及私有化
    python 装饰器、内部函数、闭包简单理解
    sql语句操作记录
    virtualBox使用nat模式下ssh连接
    git常用操作
    分布式CAP定理(转)
  • 原文地址:https://www.cnblogs.com/chenshaowei/p/13180976.html
Copyright © 2011-2022 走看看