zoukankan      html  css  js  c++  java
  • Search for a Range

    先利用二分法找到目标值,然后分别在其前半部分,后半部分用二分法找到目标值的最小范围,最大范围

    class Solution {
    public:
        vector<int> searchRange(vector<int>& nums, int target) {
            vector<int>res(2,-1);
             if(nums.size()==0) return res;
            int low=0,high=nums.size()-1,mid;
            int mid1,high1,mid2,low2;
            while(low<=high &&low>=0)
            {
                mid=(low+high)/2;
                if(nums[mid]==target)
                {
                    if(nums[low]==target)res[0]=low;
                    else
                    {
                        high1=mid;
                        while(low<high1)
                        {
                          mid1=(high1+low)/2; 
                          if(nums[mid1]==target) 
                              if(nums[mid1-1]!=target){res[0]=low=mid1;break;}
                              else high1=mid1-1;
                          else low=mid1+1;
                        }
                        res[0]=low;
                    }
                    if(nums[high]==target) res[1]=high;
                    else{
                        low2=mid;
                         while(low2<high)
                        {
                          mid2=(high+low2)/2; 
                          if(nums[mid2]==target) 
                              if(nums[mid2+1]!=target) {res[1]=low2=mid2;break;}
                              else low2=mid2+1;
                          else high=mid2-1;
                        }
                        res[1]=low2;
                    }
                    break;
                }
                else if(nums[mid]<target) low=mid+1;
                      else high=mid-1;
            }
            return res;
        }
    };

    我的逻辑太饶了,下面是网上的大牛之作

    vector<int> searchRange(int A[], int n, int target) {
        int i = 0, j = n - 1;
        vector<int> ret(2, -1);
        // Search for the left one
        while (i < j)
        {
            int mid = (i + j) /2;
            if (A[mid] < target) i = mid + 1;
            else j = mid;
        }
        if (A[i]!=target) return ret;
        else ret[0] = i;
    
        // Search for the right one
        j = n-1;  // We don't have to set i to 0 the second time.
        while (i < j)
        {
            int mid = (i + j) /2 + 1;   // Make mid biased to the right
            if (A[mid] > target) j = mid - 1;  
            else i = mid;               // So that this won't make the search range stuck.
        }
        ret[1] = j;
        return ret; 
    }
  • 相关阅读:
    update数据从一个表到另外一个表中
    数据泵导出
    导入库
    看函数
    导库中的一个表
    一个表的字段存在或者不存在另一表里
    语句2
    语句
    word 内容被锁定,无法修改
    gridview自带分页
  • 原文地址:https://www.cnblogs.com/daocaorenblog/p/5271990.html
Copyright © 2011-2022 走看看