1 条题解

  • 0
    @ 2022-11-7 16:10:29

    终于第一个通过一题了!!! 仔细想想,这道题其实不难,关键在于这条规律:一个有序数组中的同一种元素是相邻的 因此,我们可以先通过二分找到x,再通过双指针找到边界

    for (int i = 1 ; i <= q ; i++)
    {
        cin >> x;
        
        //二分
        int l = 1 , r = n , mid;
        while (l <= r)
        {
            mid = (l + r) / 2;
            if (a[mid] < x)
            {
                l = mid + 1;
            }
            else if (a[mid] > x)
            {
                r = mid - 1;
            }
            else
            {
                break;
            }
        }
    
        //双指针
        int first = mid , end = mid;
        while (a[first] == x || a[end] == x)
        {
            if (a[first] == x)
            {
                first--;
            }
            if (a[end] == x)
            {
                end++;
            }
        }
        //由于first与end找到的分别是第一个小于x的数与第一个大于x的数,所以分别需加一与减一
        first++;
        end--;
        //若数组a中没有x,则不会执行双指针代码,由于first与end的初始值相同,因此执行47~48行时会导致first大于end
        if (first > end)
        {
            first = -1;
            end = -1;
        }
        cout << first << " " << end << endl;
    }
    
    • 1

    信息

    ID
    1074
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    169
    已通过
    36
    上传者