[LeetCode] 33. 搜索旋转排序数组 ☆☆☆(二分查找)

描述

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

( 例如,数组 [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

解析

1.找出有序数组的最小数字的index。即旋转偏移量。

2.以index分为2个有序数组,分别查找即可。

代码

public static int search(int[] nums, int target) {
        if (null == nums || nums.length <= 0) {
            return -1;
        }
        int offset = offset(nums);//旋转数组的偏移量
        if (offset == -1) {
            return -1;
        } else if (offset == 0) {//有序数组没有旋转
            return erfen(nums, 0, nums.length - 1, target);
        }
        //以偏移量为分界,左右都是有序数组,分开二分即可。
        if (nums[0] <= target && nums[offset - 1] >= target) {
            return erfen(nums, 0, offset - 1, target);
        } else {
            return erfen(nums, offset, nums.length - 1, target);
        }
    }

    /**
     * 标准二分
     */
    public static int erfen(int[] nums, int start, int end, int target) {
        while (start <= end) {
            int mid = (start + end) >>> 1;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }
        return -1;
    }

    /**
     * 获取旋转有序数组最小数字的偏移量
     */
    public static int offset(int[] nums) {
        int start = 0;
        int end = nums.length - 1;
        if (nums[start] <= nums[end]) {
            return 0;
        }
        while (start <= end) {
            int mid = (start + end) >>> 1;
            if (nums[start] < nums[mid]) {
                start = mid;
            } else if (nums[start] > nums[mid]) {
                end = mid;
            } else {
                return mid + 1;
            }
        }
        return -1;
    }

原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/12125595.html

时间: 2024-10-27 18:29:20

[LeetCode] 33. 搜索旋转排序数组 ☆☆☆(二分查找)的相关文章

[leetcode] 33. 搜索旋转排序数组(Java)

33. 搜索旋转排序数组 说实话这题我连题都没有看懂....真是醉了 二分,没意思,直接交了- - https://www.jiuzhang.com/solutions/search-in-rotated-sorted-array/#tag-other 原文地址:https://www.cnblogs.com/acbingo/p/9302337.html

LeetCode 33. 搜索旋转排序数组(C#实现)——二分查找

问题:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/submissions/ 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 . 你可以假设数组中不存在重复的元素. 你的算法时间复杂度必须是 O(log n) 级别. 示例 1: 输入

[LeetCode]33. 搜索旋转排序数组(二分)

题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组?[0,1,2,4,5,6,7]?可能变为?[4,5,6,7,0,1,2]?). 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回?-1?. 你可以假设数组中不存在重复的元素. 你的算法时间复杂度必须是?O(log?n) 级别 题解 由最原始的二分框架来做. 如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在

Leetcode 33. 搜索旋转排序数组

class Solution { public: int search(vector<int>& nums, int target) { int beg = 0; int end = nums.size()-1; while(beg <= end) { int mid = beg + (end-beg)/2; //找到就直接返回 if(target == nums[mid]) return mid; else if( target < nums[mid]) { if(num

LeetCode 81——搜索旋转排序数组 II

1. 题目 2. 解答 2.1. 方法一 基于 LeetCode 33--搜索旋转排序数组 中的方法二. 当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1],[1, 1, 0, 1, 1],为了找到正确的转折点,我们查看 [mid, right] 之间有没有不等于 nums[mid] 的值,若有,则继续向右查找:否则向左查找. class Solution { public: int Binary_Search(vector<int>& num

33. 搜索旋转排序数组

https://leetcode-cn.com/problems/search-in-rotated-sorted-array/submissions/ 有序 查找 往二分查找上靠 虽然该数组被旋转导致整体无序,但从中间截断后至少有一半仍然是有序的 注意等号 从mid处划分,至少有一半是有序的.如果target在有序部分的区间内,可使用二分查找进行查找,如果没有找到直接返回-1.但如果target不在有序部分的区间内,并不能直接得出没有找到target的结论,因为有可能被旋转到了无序的区间. 每

LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 . 你可以假设数组中不存在重复的元素. 你的算法时间复杂度必须是 O(log n) 级别. 英文:Suppose an array sorted i

63. 搜索旋转排序数组 II

跟进"搜索旋转排序数组",假如有重复元素又将如何? 是否会影响运行时间复杂度? 如何影响? 为何会影响? 写出一个函数判断给定的目标值是否出现在数组中. 样例 给出[3,4,4,5,7,0,1,2]和target=4,返回 true 发现lintcode有一点不好就是这种O(n)的解法也能给过 1 bool search(vector<int> &A, int target) { 2 // write your code here 3 vector<int&g

【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是?O(log n) 级别. 如果数组中不存在目标值,返回?[-1, -1]. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例?2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1] 本题同[剑指Offer]面试题53 - I. 在排序数组