zoukankan      html  css  js  c++  java
  • #leetcode刷题之路34-在排序数组中查找元素的第一个和最后一个位置

    给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
    你的算法时间复杂度必须是 O(log n) 级别。
    如果数组中不存在目标值,返回 [-1, -1]。

    示例 1:
    输入: nums = [5,7,7,8,8,10], target = 8
    输出: [3,4]
    示例 2:
    输入: nums = [5,7,7,8,8,10], target = 6
    输出: [-1,-1]

    思路1:先用二分法找到其中某个target,再向前向后一位一位地找头和尾;

    思路2:改进一下,在第二步找头和尾时也用二分法;

    #include <iostream>
    #include <vector>
    using namespace std;
    
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> ans={-1, -1};
        if(nums.size()==0) return ans;
        if(nums.size()==1&&nums[0]==target)
            return {0,0};
        if(nums.size()==1&&nums[0]!=target)
            return ans;
        int low=0;
        int high=nums.size()-1;
        int mid=0;
        while(low<=high)
        {
            mid=(low+high)/2;
            if(nums[mid]==target) break;
            if(target<nums[mid]) high=mid-1;
            else low=mid+1;
        }
        if(low>high) return ans;
    
        int begin=mid;
        int end=mid;
    
        low=0;
        int m1=mid;
        int m2;
        while(low<=m1)
        {
            m2=(low+m1)/2;
            if(nums[m2]==target&&(m2-1)>=0&&nums[m2-1]<target)
            {
                begin=m2;
                break;
            }
            if(nums[m2]==target&&m2==0)
            {
                begin=m2;
                break;
            }
            if(nums[m2]<target&&(m2+1)<=m1&&nums[m2+1]==target)
            {
                begin=m2+1;
                break;
            }
            if(nums[m2]==target&&(m2-1)>=0&&nums[m2-1]==target) m1=m2-1;
            if(nums[m2]<target&&(m2+1)<nums.size()&&nums[m2+1]<target) low=m2+1;
        }
    
    
    
        high=nums.size()-1;
        if((mid+1)<nums.size()&&nums[mid+1]==target)
        {
            m1=mid+1;
        }
        else
            return {begin,mid};
        while(m1<=high)
        {
            m2=(m1+high)/2;
            if(nums[m2]==target&&(m2+1)<nums.size()&&nums[m2+1]>target)
            {
                end=m2;
                break;
            }
            if(nums[m2]==target&&m2==nums.size()-1)
            {
                end=m2;
                break;
            }
            if(nums[m2]>target&&(m2-1)>mid&&nums[m2-1]==target)
            {
                end=m2-1;
                break;
            }
            if(nums[m2]==target&&(m2+1)<nums.size()&&nums[m2+1]==target) m1=m2+1;
            if(nums[m2]>target&&(m2-1)>mid&&nums[m2-1]>target) high=m2-1;
        }
        return {begin,end};
    }
    
    
    int main() {
        vector<int> a={1,2,3};
    
        int target=1;
        vector<int> ans=searchRange(a,target);
        std::cout << ans[0]<<ans[1]<< std::endl;
        return 0;
    }
  • 相关阅读:
    网格模型和X文件使用面面观(转)
    3D中的OBJ文件格式详解(转载)
    机器学习随笔01
    WinForm ListControl MouseWheel Envent
    如何判断一个元素在亿级数据中是否存在? 很难吗...
    windows 虚拟机VMware 安装linux系统注意事项!!!
    windows phpinfo上不能找到memcache扩展 php版本5.6
    php 判断两个时间段是否有交集
    tp5.0 根据经纬度 获取附近信息
    php 前台生成多维数组 后台批量添加
  • 原文地址:https://www.cnblogs.com/biat/p/10596722.html
Copyright © 2011-2022 走看看