ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法-数组:二分查找

2022-01-23 23:01:36  阅读:113  来源: 互联网

标签:二分 num target nums int 算法 查找 include 左闭


算法-数组:二分查找

在一个有序(假设升序)无重复元素的数组nums中,寻找元素target,找到了就返回对应的下标,没找到就返回-1。

#include <iostream>
#include <vector>
using namespace std;
//二分查找的前提有两个:有序数组、无重复元素
//“循环不变量规则”:边界要么左闭右闭,要么左闭右开

//方法一:左闭右闭
int method(vector<int>& nums,int target){
    int n = nums.size();
    int left = 0;
    int right = n-1;
    while(left<=right){//因为是左闭右闭,所以此区间内有可能存在left=right的情况
        int middow = (left+right)/2;
        if(target == nums[middow]){
            return middow;
        }
        else if(target < nums[middow]){//在左半边
            right = middow-1;
        }
        else{//在右半边
            left = middow+1;
        }
    }
    return -1;
}

int main(){
    int n;//数组长度
    cin>>n;
    vector<int> nums;
    int num;
    for(int i = 0; i < n; i++){
        cin>>num;
        nums.push_back(num);
    }
    int target;
    cin>>target;
    cout<<"目标值所在下标为:"<<method(nums,target);
    
    return 0;
}

#include <iostream>
#include <vector>
using namespace std;

//方法二:左闭右开
int method(vector<int>& nums,int target){
    int n = nums.size();
    int left = 0;
    int right = n-1;
    while(left<right){//因为是左闭右开,所以此区间内不可能存在left=right的情况
        int middow = (left+right)/2;
        if(target == nums[middow]){
            return middow;
        }
        else if(target < nums[middow]){//在左半边
            right = middow;
        }
        else{//在右半边
            left = middow+1;
        }
    }
    return -1;
}

int main(){
    int n;//数组长度
    cin>>n;
    vector<int> nums;
    int num;
    for(int i = 0; i < n; i++){
        cin>>num;
        nums.push_back(num);
    }
    int target;
    cin>>target;
    cout<<"目标值所在下标为:"<<method(nums,target);
    
    return 0;
}

标签:二分,num,target,nums,int,算法,查找,include,左闭
来源: https://blog.csdn.net/weixin_60952096/article/details/122658784

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有