• 【leetcode 33】搜索旋转排序数组(第二遍)


    题目链接

    【题解】

    如果没有旋转这么一说。 那么问题就是一道普通的二分查找的题目。 加上旋转之后。也没有让这个题变难多少。 问题的关键在于。 在二分查找的时候。 能够想到用nums[0]这个元素来确定当前二分枚举到的元素是在哪一个区间里面的。 即是在左边那个上升区间里面,还是在右边那个上升区间里面。 不过。 知道在哪个区间以后 还有一个问题。 就是我们不能单纯的就在那个区间里面做二分。 因为那个元素可能是在另外一个区间里的。 所以还得拿目标元素和nums[0]做一个对比。 比它小然后nums[mid]在左区间的话,直接l = mid+1 跑到右边那个区间去。 比它大的话然后nums[mid]在右边这个区间的话,直接r = mid-1, 跑到左边那个区间去。 这样才能不断逼近target的目标位置 总结 在写的时候,光想着判断nums[mid]在哪个区间。然后就在那个区间里面做二分了。 但是没有想到,其实target可能不在你做二分的那个区间里面的呀!

    【代码】

    class Solution {
    public:
        int search(vector<int>& nums, int target) {
            int l = 0,r = (int)nums.size()-1;
            while (l<=r){
                int mid = (l+r)/2;
                if (nums[0]<=nums[mid]){
                    if (nums[0]>target){
                        l = mid + 1;
                    }else{
                        if (target<nums[mid]){
                            r = mid - 1;
                        }else if (target>nums[mid]){
                            l = mid + 1;
                        }else return mid;
                    }
                }else if (nums[0]>nums[mid]){
                    if (target>=nums[0]){
                        r = mid - 1;
                    }else{
                        if (target<nums[mid]){
                            r = mid - 1;
                        }else if (target>nums[mid]){
                            l = mid + 1;
                        }else return mid;
                    }
                }
            }
            return -1;
        }
    };
    
  • 相关阅读:
    matlab中的开方sqrt用牛顿迭代法实现的代码
    转载 迭代算法实现开平方
    关于verilog中小数直接赋值
    关于verilog中的signed类型
    第二十五篇:使用 sigaction 函数实现可靠信号
    第二十四篇:可靠信号机制
    第二十三篇:信号机制的两个思考
    第二十二篇:信号的接收和处理
    hdu 2918(IDA*)
    hdu 1813(IDA*)
  • 原文地址:https://www.cnblogs.com/AWCXV/p/12289738.html
Copyright © 2020-2023  润新知