三种语言实现二分(C++/Python/Java)

题目

给定一个按照升序排列的长度为 𝑛 的整数数组,以及 𝑞 个查询。

对于每个查询,返回一个元素 𝑘 的起始位置和终止位置(位置从 0 开始计数)。

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

输入格式

第一行包含整数 𝑛 和 𝑞,表示数组长度和询问个数。

第二行包含 𝑛 个整数(均在 1∼10000范围内),表示完整数组。

接下来 𝑞 行,每行包含一个整数 𝑘,表示一个询问元素。

输出格式

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

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

数据范围

1≤𝑛≤100000
1≤𝑞≤10000
1≤𝑘≤10000

输入样例:

6 3
1 2 2 3 3 4
3
4
5

输出样例:

3 4
5 5
-1 -1

C++

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;
int a[N];

int main()
{
    int n, q;
    cin >> n >> q;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    while(q--)
    {
        int x;
        cin >> x;
        int l = 0, r = n-1;
        
        while(l < r)
        {
            int mid = (l + r) >> 1;
            if(a[mid] >= x)
                r = mid;
            else
                l = mid+1;
        }
        if(a[l] != x)
            cout << "-1 -1" << endl;
        else
        {
            cout << l << " ";
            l = 0;
            r = n-1;
            while(l < r)
            {
                int mid = (l + r + 1) >> 1;
                if(a[mid] <= x)
                    l = mid;
                else
                    r = mid-1;
            }
            cout << l << endl;
        }
    }
}

Python

n, q = map(int, input().split())
a = [int(x) for x in input().split()]

while q > 0:
    q -= 1
    x = int(input())
    l, r = 0, n-1
    while l < r:
        mid = (l + r) >> 1
        if a[mid] >= x:
            r = mid
        else:
            l = mid + 1
    
    if a[l] != x:
        print("-1 -1")
    else:
        print(l, end=" ")
        l, r = 0, n-1
        while l < r:
            mid = (l + r + 1) >> 1
            if a[mid] <= x:
                l = mid
            else:
                r = mid - 1
        print(l)

Java

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int q = sc.nextInt();
        int[] a = new int[n];
        for(int i = 0; i < n; i++)
            a[i] = sc.nextInt();
        while(q-- > 0){
            int x = sc.nextInt();
            int l = 0, r = n-1;
            while(l < r){
                int mid = (l + r) >> 1;
                if(a[mid] >= x) r = mid;
                else l = mid + 1;
            }
            if(a[l] != x)
                System.out.printf("-1 -1\n");
            else{
                System.out.printf("%d ",l);
                l = 0;
                r = n-1;
                while(l < r){
                    int mid = (l + r + 1) >> 1;
                    if(a[mid] <= x) l = mid;
                    else r = mid - 1;
                }
                System.out.printf("%d\n",l);
            }
        }
    }
}
posted @ 2024-07-27 22:54  火车驶向云外0218  阅读(25)  评论(0)    收藏  举报