704. 二分查找 C++

文章目录


一、题目链接

链接: 704. 二分查找


二、参考代码

cpp 复制代码
int search(const vector<int>& nums, int target) {
    int left = 0; int right = nums.size() - 1;
    //左闭右闭[]
    while (left <= right)
    {
        int mid = (left + right) / 2;
        if (nums[mid] > target)
        {
            right = mid - 1;
        }
        else if (nums[mid] < target)
        {
            left = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
    //左闭右闭[)
    /*
    while (left < right)
    {
        int mid = (left + right) / 2;
        if (nums[mid] > target)
        {
            right = mid;
        }
        else if (nums[mid] < target)
        {
            left = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
    */
}

三、所思所悟

cin、cin.getline() 和 getline() 是 C++ 标准库中用于从标准输入(通常是键盘)读取数据的三种不同方式。它们的主要区别如下:

cin:

cin 是一个 istream 对象,用于从标准输入流读取数据。

当使用 cin 读取数据时,它会在遇到空白(如空格、制表符或换行符)时停止读取。

cin 通常用于读取单个数据项,如 int、float、double 等。

cin.getline():
cin.getline()实际上有三个参数,第三个通常省略cin.getline(接收字符串的变量,接收字符个数,结束字符)

cin.getline() 是 cin 的成员函数,用于从标准输入流读取一行数据,直到遇到换行符。

它会读取换行符之前的整行数据,包括空格,并将其存储在提供的字符数组中。

cin.getline() 通常用于读取字符串,但它不是用来读取单个数据项的好选择,因为它会将整行数据作为一个字符串读取。

getline():

getline() 是一个全局函数,用于从 istream 对象(如 cin)读取一行数据,直到遇到换行符。

它会读取换行符之前的整行数据,包括空格,并将其存储在提供的 string 对象中。

getline() 是读取一行数据的标准方式,特别是当你需要处理包含空格的字符串时。

在此题如果不知道输入的长度,但是要全部且最后一个为搜索值的时候可以这样输入

cpp 复制代码
#include <iostream>
#include <vector>
#include <sstream>
#include <string>

using namespace std;

int search(const vector<int>& nums, int target) {
    int left = 0; int right = nums.size() - 1;
    //左闭右闭[]
    while (left <= right)
    {
        int mid = (left + right) / 2;
        if (nums[mid] > target)
        {
            right = mid - 1;
        }
        else if (nums[mid] < target)
        {
            left = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
    //左闭右闭[)
    /*
    while (left < right)
    {
        int mid = (left + right) / 2;
        if (nums[mid] > target)
        {
            right = mid;
        }
        else if (nums[mid] < target)
        {
            left = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
    */
}

int main() {
    vector<int> nums;
    string data; 
    getline(cin, data);
    istringstream iss(data);
    int num;

    while (iss >> num) {
        nums.push_back(num);
    }
    int target = -1;
    if (!nums.empty()) {
        target = nums.back();
        nums.pop_back(); 
       
    }
    cout << search(nums, target);
    return 0;
}
相关推荐
WBluuue几秒前
Codeforces 1093 Div2(ABCD1D2)
c++·算法
浅念-9 分钟前
「一文吃透 BFS:从层序遍历到锯齿形、最大宽度、每层最大值」
数据结构·算法
汉克老师11 分钟前
GESP5级C++考试语法知识(十三、贪心算法(一))
算法·贪心算法·海盗船·gesp5级·gesp五级·排队接水
玩转单片机与嵌入式1 小时前
玩转边缘AI(TInyML):需要掌握的C++知识汇总!
开发语言·c++·人工智能
历程里程碑1 小时前
4 Git远程协作:从零开始,玩转仓库关联与代码同步(带实操代码讲解)
大数据·c++·git·elasticsearch·搜索引擎·gitee·github
梦想画家1 小时前
Apache AGE实战指南:从Cypher语法到核心图算法
算法·cypher·apache age
茉莉玫瑰花茶1 小时前
Qt 信号与槽 [ 1 ]
开发语言·数据库·qt
刀法如飞2 小时前
Go数组去重的20种实现方式,AI时代解决问题的不同思路
后端·算法·go
汉克老师2 小时前
GESP5级C++考试语法知识(贪心算法(一)课堂例题精讲)
c++·贪心算法·gesp5级·gesp五级·贪心规律