首页 > 其他分享 >数的范围 | 整数二分

数的范围 | 整数二分

时间:2023-04-29 15:33:55浏览次数:38  
标签:二分 target nums int mid 整数 left 范围

AC.789 数的范围

题目描述

给定一个按照升序排列的长度为 \(n\) 的整数数组,以及 \(q\) 个查询。对于每个查询,返回一个元素 \(k\) 的起始位置和终止位置(位置从 \(0\) 开始计数)。

输入格式

第一行包含整数 \(n\) 和 \(q\),表示数组长度和询问个数。第二行包含 n 个整数(均在 \(1∼10000\) 范围内),表示完整数组。接下来 \(q\) 行,每行包含一个整数 \(k\),表示一个询问元素。

输出格式

共 \(q\) 行,每行包含两个整数,表示所求元素的起始位置和终止位置。

如果数组中不存在该元素,则返回 \(-1 -1\)。

数据范围

\(1≤n≤100000\)

\(1≤q≤10000\)

\(1≤k≤10000\)


输入样例

6 3
1 2 2 3 3 4
3
4
5

输出样例

3 4
5 5
-1 -1




题解

#include<iostream>
#include<vector>
using namespace std;
#define ios_base \
    ios::sync_with_stdio(false);\
    cin.tie(nullptr),cout.tie(nullptr)

int n,q,target;
vector<int> vc;
//二分查找目标元素第一次出现的位置
int binary_search_first(vector<int>& nums,int target)
{
    int left=0,right=nums.size()-1;  //确定左右边界
    int first_position=-1;  //记录目标元素最后一次出现的位置

    while (left<=right)  //循环进行二分查找
    {
        int mid=left+((right-left)>>1);  //如果直接取平均可能会溢出
        if(nums[mid]==target)
        {
            first_position=mid;
            right=mid-1;  //将右边界左移
        }else if (nums[mid]<target)
        {
            left=mid+1;  //左边界右移
        }else{
            right=mid-1;  //右边界左移
        }
        
    }
    return first_position;
}

//二分查找目标元素最后一次出现的位置
int binary_search_last(vector<int>& nums,int target)
{
    int left=0,right=nums.size()-1;  //确定左右边界
    int last_position=-1;  //记录目标元素最后一次出现的位置

    while (left<=right)  //循环进行二分查找
    {
        int mid=left+((right-left)>>1);  //如果直接取平均可能会溢出
        if(nums[mid]==target)
        {
            last_position=mid;
            left=mid+1;  //将左边界右移
        }else if (nums[mid]<target)
        {
            left=mid+1;  //左边界右移
        }else{
            right=mid-1;  //右边界左移
        }
        
    }
    return last_position;
}

int main()
{         
    ios_base;
    cin>>n>>q;
    for (int i = 0; i < n; i++)
    {
        int temp;
        cin>>temp;
        vc.push_back(temp);
    }
    while (q--)
    {
        cin>>target;
        int start=binary_search_first(vc,target);
        int end=binary_search_last(vc,target);
        if (start!=-1 && end!=-1)
        {
            cout<<start<<" "<<end<<'\n';
        }else{
            cout<<"-1 -1"<<'\n';
        }
        
    }
    
    return 0;
}

标签:二分,target,nums,int,mid,整数,left,范围
From: https://www.cnblogs.com/shinnyblue/p/17364051.html

相关文章

  • 数论基础1-整数的离散型
    例题一:例题二:例题三:例题四: ......
  • 二分图
    \[二分图\begin{cases}\染色法\\[4ex]匈牙利算法\end{cases}\\]染色法//染色法判别二分图模板intn; //n表示点数inth[N],e[M],ne[M],idx; //邻接表存储图intcolor[N]; //表示每个点的颜色,-1表示为染色,0表示白色,1表示黑色//参数:u表示当前节点,c表示当前......
  • pwn刷题笔记(整数溢出)
    [BJDCTF2nd]r2t3写出反汇编代码如下:intds:__bss_start;intmain(){charbuf[0x408-4]intvar[4];my_init();puts("**********************************");puts("*WelcometotheBJDCTF!*");puts("[+]Ret......
  • 二分查找算法讲解及其C++代码实现
    二分查找算法是一种常用的查找算法,也被称为折半查找。它可以在有序的数组或列表中快速查找需要的元素。算法描述:首先确定数组的中间位置mid=(left+right)/2;然后将要查找的值key与中间位置的值进行比较;如果key等于中间位置的值,则查找成功,返回mid;如果key小于中间位置的值,则在......
  • # 快讯 | 整数智能携手格拉斯哥大学举办AI圆桌分享会
    算法、算力和数据作为人工智能发展的三大支柱,而获取高质量的数据已经成为人工智能工程化进程中的难题。如何能够寻找到与算法训练完美适配的数据集,在数据生产过程中有哪些常见的痛点?5月12日,由整数智能与格拉斯哥大学合作举办了一场人工智能领域的开放性讲座。曾参与编辑《人工智能......
  • sed 指定范围内查询
    时间范围内的查询sed-n'/11:0718:29:20/,/11:0718:31:11/p'catalina.outsed-n'/11:0718:29:/,/11:0718:31:/p'catalina.out 为什么sed可以根据时间范围查询sed命令并不能直接根据时间范围查询,而是利用了时间戳出现的字符串匹配功能,从而找到包含指定时间戳范围内......
  • 快速幂+大整数乘法
    (快速幂+位运算)\(0\lea,b\le10^9\\0\leqp\leq10^9\)快速幂:(1)取模运算法则(a+b)%p=(a%p+b%p)%p(a-b)%p=(a%p-b%p)%p(a*b)%p=(a%p*b%p)%p(2)快速幂可以在O(logk)内算出\(a^k\)modp的值先处理出:\(a^{2^0}\mod\p\)\(a......
  • 【二分查找】LeetCode 153. 寻找旋转排序数组中的最小值
    题目链接153.寻找旋转排序数组中的最小值思路首先分析一下旋转数组可能有的状态:左<中<右,此时最小值肯定在左边,应当收缩右边界左<中,中>右,此时最小值肯定在右半段,应当收缩左边界左>中,中<右,此时最小值肯定在左半段,应当收缩右边界分析这三种状态可以发现,中值小......
  • 求某一个范围内完数的个数
    如果一个数等于它的因子之和,则称该数为完数,例如“6”的因子为1,2,3,而6=1+2+3,因此6是完数问题分析:假设一个数d,然后计算出它的每个因子,用到for循环,假如是a,b,c,然后进行一个判断如果a+b+c=d,就说明d是完数,应该要用到两层循环,最外层循环从2开始,一直到d,内层循环从1开始,一直到a,然后开始取余......
  • 整体二分学习笔记
    整体二分引入对于一堆询问,如果每个单独的询问都可以二分解决的话,时间复杂度为\(O(NM\logN)\),但实际上每次二分都会有一些残留信息被我们扔掉,如果我们将所有询问一起二分,就可以最大时间的减小复杂度。讲解经典例题:区间第k大给定一个序列a和一个整数S,有2种操作:1.将a......