链家在线测评编程题

本文介绍了一种使用改进二分查找解决区间查找问题的方法。通过预处理计算每个区间的起始和结束位置,实现了对查询数据的有效定位。该方法适用于有序区间编号的数据集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

这里写图片描述

我感觉这就是简单的二分查找就行了,因为区间编号是有序了的啊,但是不能直接套二分查找,需要找出每个区间的的范围,然后修改判断条件就行了,代码如下:

// Lianjia01.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <map>
#include <queue>
#include <set>
#include <iterator>
#include <algorithm>
using namespace std;


int findk(int * arrS, int * arrE, int low, int high, int key) 
{
    if (low > high)
        return -1;
    int mid = low + (high - low) / 2;
    if (key >= arrS[mid] && key <= arrE[mid])return mid+1;
    else if (key >= arrE[mid])return findk(arrS, arrE, mid + 1, high, key);
    else return findk(arrS, arrE, low, mid - 1, key);
}


int main()
{
    ifstream fin("file.txt");
    int n;
    fin >> n;
    int * arr = new int[n];
    for (int i = 0;i < n;++i)fin >> arr[i];

    int * arrS = new int[n];
    int * arrE = new int[n];
    arrS[0] = 1;
    arrE[0] = arr[0];
    int sum = 0;
    for (int i = 0;i < n-1;++i)
    {
        sum += arr[i];
        arrS[i+1] = sum + 1;
        arrE[i] = sum;
    }
    sum += arr[n - 1];
    arrE[n - 1] = sum;

    /*for (int i = 0;i < n;++i)
    cout << arrS[i] << "   " << arrE[i] << endl;*/

    int q;
    fin >> q;
    int query;
    for (int i = 0;i < q;++i)
    {
        fin >> query;
        cout << findk(arrS, arrE, 0, n, query) << endl;
    }


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值