zoukankan      html  css  js  c++  java
  • [1]力扣每日一题

    2020.4.27搜索旋转排序数组

    题目呈现如下:

    题干
    题目传送门

    思路介绍:

    • 首先,题目要求复杂度在(O(log_{2}n))一下,可以预见必定要利用搜索旋转排序数组部分有序的特点,采用基于二分检索的检索方法.
    • 接下来主要的难题在于如何在搜索的某个状态,确定往前走还是往后走.实质上我们考虑的并不是左边界和有边界,我们的关注点只在--mid,亦即二分搜索每次拿来与Key对比的元素.边界的往哪个方向缩是很顺其自然的事情.我们可以列举一下可能出现的所有情况,然后据此确定往哪里缩.
      形象化的思路如图:
      流程图

    下附AC代码

    class Solution {
    public:
        int search(vector<int>& nums, int target) {
            if(!nums.size()) return -1; // 注意,没有标程里面默认非空的条件
            int l = 0, r = nums.size()-1; // 左边界和右边界
            while (l < r) {
                int mid = (l + r)/2;
                if ((nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid])) // 这个参照题解而来,和上述思路大差不差,其亦或优化实在惊艳
                else
                    r = mid;
            }
            return nums[r] == target ? r : -1; // 这地方是r=l的,r和l都可以
        }
    };
    
  • 相关阅读:
    二分查找代码
    顺序查找代码
    js原生获取css属性
    前端使用nginx上传文件时,进度获取不对
    动态赋值poster,无法显示
    git 命令收藏
    promise笔记
    vscode自定义代码块
    vuex的初始化
    webstorm添加自定义代码块
  • 原文地址:https://www.cnblogs.com/tsuipo/p/12791487.html
Copyright © 2011-2022 走看看