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>& nums, int left, int right, int target)
    {
        int mid = 0;

        while(left <= right)
        {
            mid = left + (right - left) / 2;
            if (nums[mid] == target)
            {
                return mid;
            }
            else if(nums[mid] < target)
            {
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }

       return -1;
    }

    bool search(vector<int>& nums, int target) {

        if (nums.size() == 0) return 0; // 数组为空

        int left = 0;
        int right = nums.size() - 1;
        int mid = 0;

        while(left < right)
        {
            mid = left + (right - left) / 2;

            if (nums[mid] > nums[right])
            {
                left = mid + 1;
            }
            else if (nums[mid] < nums[right])
            {
                right = mid;
            }
            else // nums[mid] = nums[right]
            {
                int flag = 1;

                for (int i = mid; i < right; i++)
                {
                    int temp = nums[mid];
                    if (nums[i] != temp) // mid 到 right 之间有不等于 nums[mid] 的值,向右边查找
                    {
                        flag= 0;
                        left = mid + 1;
                        break;
                    }
                }

                if (flag)
                {
                    right = mid; // mid 到 right 之间没有小于 nums[mid] 的值,向左边查找
                }
            }
        }

        int a = Binary_Search(nums, 0, right-1, target);
        int b = Binary_Search(nums, right, nums.size() - 1, target);

        return a == -1 && b == -1 ? false : true;

    }
};
2.2. 方法二

基于 LeetCode 33——搜索旋转排序数组 中的方法三。

当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1],[1, 1, 0, 1, 1],我们直接将右边界 right 减一,然后继续查找。

class Solution {
public:

    bool search(vector<int>& nums, int target) {

       int left = 0;
        int right = nums.size() - 1;
        int mid = 0;

        while(left <= right)
        {
            mid = left + (right - left) / 2;

            if (nums[mid] == target)
            {
                return true;
            }
            else if (nums[mid] < nums[right])  // nums[mid] 在右边升序的数据区间内
            {
                if (nums[mid] < target && target <= nums[right]) left = mid + 1;
                else    right = mid - 1;
            }
            else if (nums[mid] > nums[right]) // nums[mid] 在左边升序的数据区间内
            {
                if (nums[left] <= target && target < nums[mid]) right = mid - 1;
                else    left = mid + 1;
            }
            else // nums[mid] = nums[right]
            {
                right--;
            }
        }

        return false;
    }
};

获取更多精彩,请关注「seniusen」!

原文地址:https://www.cnblogs.com/seniusen/p/9862328.html

时间: 2024-10-27 16:52:20

LeetCode 81——搜索旋转排序数组 II的相关文章

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] 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. 搜索旋转排序数组 ☆☆☆(二分查找)

描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [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], ta

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) 级别 题解 由最原始的二分框架来做. 如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在

搜索旋转排序数组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 进阶: 这是https://w

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(力扣)——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

LintCode-搜索旋转排序数组 II

跟进"搜索旋转排序数组",假如有重复元素又将如何? 是否会影响运行时间复杂度? 如何影响? 为何会影响? 写出一个函数判断给定的目标值是否出现在数组中. 您在真实的面试中是否遇到过这个题? Yes 样例 给出[3,4,4,5,7,0,1,2]和target=4,返回 true 标签 Expand 分析:有重复数据还是很蛋疼的,重点在于消重,要使得A[l]严格大于A[r],这样就可以继续判断区间的单调性,从而二分 代码: class Solution { /** * param A :