搜索旋转排序数组 II

本文介绍了如何解决搜索旋转排序数组 II 的问题,重点讲解了使用二分查找的方法,以及暴力解法。通过实例展示了当数组经过未知下标的旋转后,如何在数组中高效地查找目标值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终于还是踏上了算法这条不归路,记录一下做题的历程


搜索旋转排序数组 II

已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为[nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …,nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为[4,5,6,6,7,0,1,2,4,4] 。
给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums中存在这个目标值 target ,则返回 true ,否则返回 false 。

示例

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

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

二分查找

二分查找是一种效率较高的查找方法,前提是数据结构必须先排好序,可以在数据规模的对数时间复杂度内完成查找。
数据整体或数据的一边满足一定的规律时,可以缩减问题的规模(舍弃一边,缩短查找区间),以达到降低查找某特定值的时间复杂度。

代码

class Solution {
public:
    bool search(vector<int> &nums, int target) {
        int n = nums.size();            
        if (n == 0) {           // 特殊情况
            return false;
        }
        if (n == 1) {           // 直接判断该元素是否和目标值相等
            return nums[0] == target;
        }
        int l = 0, r = n - 1;
        while (l <= r) {            // l > r 时二分搜索结束
            int mid = (l + r) / 2;          // 寻找有序的一边
            if (nums[mid] == target) {          // 直接判断中间值是否和目标值相等
                return true;
            }
            if (nums[l] == nums[mid] && nums[mid] == nums[r]) {         // 相等时无法判定那边有序,左右边界进行相对移动后再判断。
                ++l;
                --r;
            } else if (nums[l] <= nums[mid]) {          // 左边界小于等于中间值,左边有序。
                if (nums[l] <= target && target < nums[mid]) {          // 判断目标值是否在此区间内,在区间内则遍历这个区间,判断数组内元素是否存在和目标值相等的值。
                    r = mid - 1;
                } else {            // 不在则遍历无序的一边。
                    l = mid + 1;
                }
            } else {            // 左边界大于中间值,右边有序
                if (nums[mid] < target && target <= nums[n - 1]) {          // 同上判断目标值是否在有序的区间内。
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return false;
    }
};


暴力解法

直接遍历整个数组(狗头)

代码

bool search(int* nums, int numsSize, int target){
    for(int i=0;i<numsSize;++i)
        if(nums[i] == target)
            return true;
    return false;
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值