LeetCode——34 搜索范围:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级 - Go语言中文社区

LeetCode——34 搜索范围:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级


拿到题目,看到时间要求O(logn),立刻想到了折半查找

已通过的代码如下:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        //折半查找思路
        int low,high,mid,len;
        len=nums.size();
        low=0;
        high=len-1;
        vector<int> result(2,-1); //初始化返回两个-1
        if(len == 0)
            return result;        //容易忽略输入为空的情况
        
        while(low <= high)
        {
            mid = ( low + high )/2;
            if(target == nums[mid])  //等于有些麻烦,需要从左右两侧查找,确定范围
            {
                int i = mid;
                int j = mid;
                while ((i>=0) && (nums[i] == target))   i--;
                if(i<0) 
                    result[0]=0;
                else  
                    result[0]=i+1;    //用自增或自减,先增还是先操作顺序位置容易出错,所以直接加1或-1
                while ((j<len) && (nums[j] == target))  j++;
                if(j>len) 
                    result[1]=len-1;
                else  
                    result[1]=j-1;
                return result;
            }
            else if(target < nums[mid]) //小于
                high = mid-1;
            else if(target > nums[mid])  //大于
                low = mid+1;
        }
        return result;
    }
};

整体是按照折半的思路走的,就是做等于情况的时候,有些绕弯,但是还是通过了测试。不过我自己没有分析出来时间性能到底是多少。Leetcode给的结果还是让我很吃惊的,超过了98.26%,嗯,还不错 


通过他的时间性能测试还是经过了多次修改的,也参考了一些代码https://blog.csdn.net/i_am_bird/article/details/78748163,其中的思想和我是一样的,但是代码运行显示超时,这我也就不明白了,希望我的代码对大家有用吧!

原创哦!

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/honeyht/article/details/80724530
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-19 17:59:21
  • 阅读 ( 1510 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢