IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【leetcode】二分法-34.在排序数组中查找元素的第一个和最后一个位置 -> 正文阅读

[数据结构与算法]【leetcode】二分法-34.在排序数组中查找元素的第一个和最后一个位置

题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。

题目分析:不考虑时间复杂度的话,可以直接遍历该列表,记录target所在的所有位置存放在一个vector中,如果遍历结束,该vector为空,则说明给定数组中没有target值;若该vector的size==1,则说明target只出现过一次,那么在补充填入一个结束位置即可;否则,该target在数组中出现多次,那么vector的长度可能大于2,仅需要提取第一个元素和末尾元素,即是target出现的开始位置和结束位置。

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int>range;
        vector<int>ans;
        for(int i = 0;i<nums.size();i++)
        {
            if(nums[i] ==target )
            {
                range.push_back(i);
            }
        }
        if(range.size()==0)
        {
            ans.push_back(-1);
            ans.push_back(-1);
        }
        else if(range.size()==1)
        {
            ans.push_back(range[0]);
            ans.push_back(range[0]);
        }
        else
        {
            ans.push_back(range[0]);
            ans.push_back(range[range.size()-1]);
        }
        return ans;
    }
};

执行用时:8 ms, 在所有 C++ 提交中击败了68.07%的用户
内存消耗:13.4 MB, 在所有 C++ 提交中击败了18.60%的用户

进阶:
可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

分析:O(log n)为二分法的复杂度,通过二分法,确定target的开始和结束位置。

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int>range;
        if(nums.size()!=0)
        {
            int a = 0,b = nums.size()-1;//用来记录开始的区间
            int c = 0,d = INT_MAX;//用来记录结束的区间
            bool no = false,no2= false;//标识是否遍历到过target
            int times=0;//表示第几次遍历到target,只有第一次才需要设置cd
            while(a<b || (c<d && d!=INT_MAX ))
            {
                //no = false;
                //no2 = false;
                if(a<b)
                {
                    int middle = (a+b)/2;
                    if(nums[middle]!=target)
                    {
                        if(nums[middle]<target)
                        {
                            a = middle+1;
                            b = b;
                        }
                        else
                        {
                            a = a;
                            b = middle-1;
                        }
                    }
                    else
                    {
                        if(times==0)
                        {
                            no = true;
                            a = a;
                            d = b;
                            c = middle+1;
                            b = middle-1;
                            times++;
                        }
                        else
                        {
                            a = a;
                            b = middle-1;
                        }
                    }
                }
                if(d!=INT_MAX && c<d )
                {
                    int middle2 = (c+d)/2;
                    if (nums[middle2]!=target)
                    {
                        if (nums[middle2]>target)
                        {
                            c = c;
                            d = middle2-1;
                        }
                        else
                        {
                            c = middle2+1;
                            d = d;
                        }
                    }
                    else
                    {
                        c = middle2+1;
                        d = d;
                        //no2 = true;
                    }
                }
            }
            if(nums[a]==target && nums[c]==target)
            {
                range.push_back(a);
                range.push_back(c);
            }
            else if(nums[a]==target && nums[c]!=target)
            {
                range.push_back(a);
                if(no==false)
                {
                    range.push_back(a);
                }
                else
                {
                    range.push_back(c-1);
                }
            }
            else if(nums[a]!=target && nums[c]==target)
            {
                if(no==false)
                {
                    range.push_back(c);
                }
                else
                {
                    range.push_back(a+1);
                }
                range.push_back(c);
            }
            else
            {
                if(no==false)
                {
                    range.push_back(-1);
                    range.push_back(-1);
                }
                else
                {
                    range.push_back(a+1);
                    range.push_back(c-1); 
                }
            }
        }
        else
        {
            range.push_back(-1);
            range.push_back(-1);
        }
        return range;
    }
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:13.4 MB, 在所有 C++ 提交中击败了7.65%的用户

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-26 12:25:59  更:2021-10-26 12:26:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:45:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码