zoukankan      html  css  js  c++  java
  • leetcode 33 Search in Rotated Sorted Array

    题意:给一个旋转过的升序序列,比如[0, 1, 2, 3, 4]可以旋转为[2, 3, 4, 0, 1],然后给一个目标数,求他在不在这个序列中。

    解法:如果不旋转的话就是个普通的二分查找,但是旋转之后需要算index什么的好麻烦……旋转的偏移量也可用二分求,所以就是两次二分……对于我这个二分苦手来说就当练练二分了……

    看了discuss有人说线性查找就过了……吐血……数据真弱……

    代码:

    class Solution {
    public:
        int search(vector<int>& nums, int target) {
            int ri = 0; //旋转的偏移量
            int len = nums.size();
            int l = 0, r = len - 1, mid;
            if(nums[0] > nums[len - 1]) {
                while(l <= r) {
                    if(l == r) {
                        ri = l;
                        break;
                    }
                    mid = (l + r) >> 1;
                    if(nums[mid + 1] > nums[r]) l = mid + 1;
                    else if(nums[l] > nums[mid]) r = mid;
                    else {
                        ri = mid + 1;
                        break;
                    }
                }
            }
            l = 0, r = len - 1, mid;
            l = (l + ri) % len;
            r = (r + ri) % len;
            mid = (l + (r + len - l) % len / 2) % len;
            int cnt = 0;
            while(cnt < 100) { //这里的条件算起来好麻烦……所以就写了个计数器……反正不会超过log(INT_MAX)的……
                if(nums[mid] == target) return mid;
                else if(nums[mid] > target) r = (mid + len - 1) % len;
                else if(nums[mid] < target) l = (mid + 1) % len;
                mid = (l + (r + len - l) % len / 2) % len;
                cnt++;
            }
            return -1;
        }
    };
    

      

  • 相关阅读:
    [整理]Win下好用的Markdown工具
    tcpip http socket
    [整理].net中的延迟初始化器
    [整理]ASP.NET WEB API 2学习
    [整理]ASP.NET MVC 5
    [转载]AngularJS 指令 用法
    [整理]HTML5 WebSocket
    [整理]CSS3 滤镜
    [整理]WebAPP开发的框架
    [整理]AngularJS移动端开发遇到的问题
  • 原文地址:https://www.cnblogs.com/Apro/p/5197806.html
Copyright © 2011-2022 走看看