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

    搜索旋转排序数组
    题目:

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

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

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

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

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

    示例 1:

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

    示例 2:

    输入: nums = [4,5,6,7,0,1,2], target = 3
    输出: -1

    解题思路: 运用二分查找进行解题, 首先判断当前mid所处区间, 如果在右侧有序区间则将target与区间内mid与r进行比较, 否则将target与mid和l进行比较然后分析l, r的变化

    class Solution {
        public int search(int[] nums, int target) {
            if(nums == null || nums.length == 0) return -1;
            
            int l = 0,r = nums.length - 1;
            while(l <= r){
                int mid = l + (r - l) / 2;
                if(nums[mid] == target) return mid;
                if(nums[mid] < nums[r]) {   //在右侧递增区间 -> 右侧有序
                    if(target > nums[mid] && target <= nums[r]) l = mid + 1;     //说明target 在 mid -> r 区间内
                    else r = mid - 1;
                } else {
                    if(target >= nums[l] && target < nums[mid]) r = mid - 1;    //说明target 在 l -> mid 区间内
                    else l = mid + 1;
                }
            }
            
            return -1;
        }
    }
    

    重新写了一个比较好理解, 但是更复杂的写法

    class Solution {
        public int search(int[] nums, int target) {
            int l = 0, len = nums.length, r = len - 1;
            while(l <= r) {
                int mid = l + (r - l) / 2;
                if(nums[mid] == target) {
                    return mid;
                }
                
                if(nums[mid] <= nums[len - 1]) {
                    if(nums[mid] < target && target <= nums[len - 1]) {
                        l = mid + 1;
                    } else {
                        r = mid - 1;
                    }
                } else {
                    if(target >= nums[0] && nums[mid] > target) {
                        r = mid - 1;
                    } else {
                        l = mid + 1;
                    }
                }
            }
            
            return -1;
        }
    }
  • 相关阅读:
    积水路面Wet Road Materials 2.3
    门控时钟问题
    饮料机问题
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
    Educational Codeforces Round 82 (Rated for Div. 2)部分题解
    Educational Codeforces Round 86 (Rated for Div. 2)部分题解
    Grakn Forces 2020部分题解
    2020 年百度之星·程序设计大赛
    POJ Nearest Common Ancestors (RMQ+树上dfs序求LCA)
    算法竞赛进阶指南 聚会 (LCA)
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/13891163.html
Copyright © 2011-2022 走看看