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

    http://oj.leetcode.com/problems/search-for-a-range/

    要求复杂度为O(lgn),用二分查找的思想。

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class Solution {
    public:
        void fun(int* A,int start,int end,int target,vector<int> &ans)
        {
            if(start>end || ( start == end && A[start]!= target ))
            {
                ans.push_back(-1);
                ans.push_back(-1);
                return;
            }
            if(start == end && A[start] == target)//只有一个元素了
            {
                ans.push_back(start);
                return;
            }
            if(A[start] == target && target ==A[end])
            {
                ans.push_back(start);
                ans.push_back(end);
                return;
            }
            int middle = (start + end)/2;
            if(A[middle]<target)
                fun(A,middle+1,end,target,ans);
            else if(A[middle]>target)
                fun(A,start,middle-1,target,ans);
            else
            {
                ans.push_back(middle);
                return;
            }
            return;
        }
        vector<int> searchRange(int A[], int n, int target) {
            vector<int> ans;
            if(n == 0)
                return ans;
    
            fun(A,0,n-1,target,ans);
    
            int small,large;
            if(ans[0] == -1) //肯定没找到
            {
                ans.clear();
                ans.push_back(-1);
                ans.push_back(-1);
                return ans;
            }
            if(ans.size()==1) //ans中只有一个元素
                small = large = ans[0];
    
            if(ans.size() == 2)
            {
                small = ans[0];
                large = ans[1];
            }
            while(small>=0 && A[small] == target) //往左边扩展
                small--;
            while(large<=n-1 && A[large] == target) //往右边扩展
                large++;
            if(small == -1 || A[small]!=target) //考虑上面while循环的退出条件
                small++;
            if(large== n || A[large]!=target)
                large--;
            ans.resize(2); //可能ans的size是1
            ans[0] = small; //将扩展后的再赋值回来
            ans[1] = large;
            return ans;
        }
    };
    
    int main()
    {
        Solution myS;
        int A[] = {0,0,2,3,4,4,4,5};
        vector<int> ans = myS.searchRange(A,8,0);
        return 0;
    }
  • 相关阅读:
    Red Hat Enterprise Linux 7.x新特性
    PostgreSQL角色和权限
    PostgreSQL的约束
    Postgresql临时表
    启迪心灵的句子
    Quartz 2.2 动态添加、修改和删除定时任务
    mysql 操作杂记
    ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决
    oracle 归档日志
    centos添加硬盘
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3515189.html
Copyright © 2011-2022 走看看