第一个wa,最后一个TLE,求解

P2249 【深基13.例1】查找

xtlnb666 @ 2023-02-05 12:09:31

#include <bits/stdc++.h>
using namespace std;

int a[1000005];

void check(int l, int r, int key) {
    int p = (l + r) / 2;
    int flag = a[p];
    if (l > r) {
        cout << -1 << " ";
    } else if (flag == key) {
        while (a[p] == key) {
            p--;
        }
        cout << p + 2 << " ";
    } else if (key < flag) {
        check(l, p - 1, key);
    } else {
        check(p + 1, r, key);
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < m; i++) {
        int j;
        cin >> j;
        check(0, n - 1, j);
    }
    return 0;
}

by Wtmwy @ 2023-02-18 23:05:03

最后一个超时是因为可能第一次就在a数组中间找到了这个数,但是你还要一个一个往前找是否有相同的,就如你写的while (a[p] == key) {p--;}这样耗费时间很多


by Wtmwy @ 2023-02-18 23:08:54

@xtlnb666 第一个错误是因为可能找到a[0]之后还向前,建议你的while (a[p] == key) {p--;}加一个if(p==0) break;


by xtlnb666 @ 2023-02-20 18:30:09

@z2475547481 谢谢


by Wtmwy @ 2023-02-20 23:19:58

@xtlnb666如若通过,求关注


by mooktian @ 2023-03-24 16:06:29

@Wtmwy 谢谢,关注你了。


|