Search in Rotated Sorted Array && Search in Rotated Sorted ArrayII

Search in Rotated Sorted Array


我的思路:

1、在一个没有重复数字,已经排序好的,旋转过的数组中找到一个数,返回数组中的下标,如果没有返回-1。

2、找到旋转的轴,然后进行两段二分查找。

3、关键是找到mid这个点。我使用的是两个指针从后面往前遍历查找。

class Solution {
public:
    int search(int A[], int n, int target) {
        if (n < 0)
            return -1;
        int begin = 0, end = n -1;
        while (A[begin] > A[end]) {
            begin++;
            end--;
        }
        int mid = begin == end ? (A[begin - 1] < A[begin] ? begin : begin - 1) : (A[end] > A[end + 1] ? end : begin - 1);
    
        int ans = binary_find(A, 0, mid, target);
        if (ans != -1)
            return ans;
        else
            return binary_find(A, mid + 1, n - 1, target);
    }
private:
    int binary_find(int *A, int low, int high, int target) {
        if (high < low)
            return -1;
        int mid = (low + high) / 2;
        while (low <= high) {
            if (A[mid] == target)
                return mid;
            else if (target > A[mid])
                low = mid + 1;
            else
                high = mid - 1;
            mid = (high + low) / 2;
        }
        return -1;
    }
};

别人思路:

1、别人都差不多,新的思路,见下一题。


Search in Rotated Sorted Array II

我的思路:

1、如果数组中有重复的数,会怎么样?

2、修改了下指针的移动方式,每次从两边开始比较两对数,和两个指针的大小。找到分割点。依旧使用二分查找来判断是否存在这个数。

代码如下:

    bool search(int A[], int n, int target) {
        if (n < 0)
            return false;
        else if (n == 1) {
            if (A[0] == target)
                return true;
            else 
                return false;
        }
        int begin = 0, end = n -1;
        while (A[begin] <= A[begin + 1] && A[end] >= A[end - 1] && begin <= end) {
            begin++;
            end--;
        }
        int mid = A[begin] > A[begin + 1] ? begin : end - 1;
        if (binary_find(A, 0, mid, target))
            return true;
        else
            return binary_find(A, mid + 1, n - 1, target);
    }

别人思路:

1、既然是旋转数组,就可以在两段中进行二分查找,分析好每段要怎么划分。每次直接找首尾两端的中间点,从这个点开始两端二分查找,每次都可以消除一半的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值