数据结构——二分算法

news2024/11/16 13:36:55

二分查找

1. 在排序数组中查找元素的第一个和最后一个位置


代码实现:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int binarySearch(int *nums, int numsSize, int target) {
    int l = 0, r = numsSize - 1;         
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (nums[mid] == target) {            
            return mid;
        } else if (nums[mid] > target) {      
            r = mid - 1;
        } else if (nums[mid] < target) {      
            l = mid + 1;
        }
    }
    return -1;
}

int* searchRange(int *nums, int numsSize, int target, int *returnSize) {
    int *res = malloc(sizeof(int) * 2);
    memset(res, -1, sizeof(int) * 2);
    *returnSize = 2;
    if (nums == NULL || numsSize < 1) {
        return res;
    }
    int ind = binarySearch(nums, numsSize, target);
    if (ind == -1) {
        return res;
    }
    int i, j;
    for (i = ind - 1; i >= 0; i--) {
        if (nums[i] != target) {
            break;
        }
    }
    res[0] = i + 1;
    for (j = ind + 1; j < numsSize; j++) {
        if (nums[j] != target) {
            break;
        }
    }
    res[1] = j - 1;
    return res;
}

2. 搜索插入位置

代码实现:

/*
    函数功能:返回有n个元素的数组arr中,找等于key或者第一个比key大的数的下标
*/
int binary_search_v1(int *arr, int n, int key) {
    int head = 0, tail = n - 1, mid; // 左闭右闭
    while (head <= tail) {
        mid = (head + tail) >> 1;
        if (key > arr[mid]) {
            head = mid + 1;
        } else if (key < arr[mid]) {
            tail = mid - 1;
        } else if (key == arr[mid]) {
            return mid;
        }
    }
    return head;
}

int binary_search_v2(int *arr, int n, int key) {
    int head = 0, tail = n, mid; // 左闭右开
    while (head < tail) {
        mid = (head + tail) >> 1;
        if (key > arr[mid]) {
            head = mid + 1;
        } else if (key < arr[mid]) {
            tail = mid;
        } else if (key == arr[mid]) {
            return mid;
        }
    }
    return head;
}
int binary_search_v3(int *arr, int l, int n, int key) {
    int head = l, tail = n; // 左闭右开
    int mid = (head + tail) >> 1;
    if (head >= tail) {
        return head;
    }
    if (key > arr[mid]) {
        head = mid + 1;
    } else if (key < arr[mid]) {
        tail = mid;
    } else if (key == arr[mid]) {
        return mid;
    }
    return binary_search_v3(arr, head, tail, key); 
}

int searchInsert(int *nums, int numsSize, int target) {
    return binary_search_v1(nums, numsSize, target);
    // return binary_search_v2(nums, numsSize, target);
    // return binary_search_v3(nums, 0, numsSize, target);
}

3. 二分查找

代码实现:

/*
最基本的二分查找
    前提:待查找序列是有序的
    时间复杂度:O(logn) 以2为底的对数
*/
int binary_search_v1(int *arr, int n, int key) {
    int head = 0, tail = n - 1, mid; // 左闭右闭
    while (head <= tail) {
        mid = (head + tail) >> 1; // 右移
        if (arr[mid] == key) { // 找到了
            return mid;
        }
        if (arr[mid] < key) { // 未找到
            head = mid + 1;
        } else {
            tail = mid - 1;
        }
    }
    return -1;  // 没找到,返回-1
}

int binary_search_v2(int *arr, int n, int key) {
    int head = 0, tail = n, mid; // 左闭右开
    while (head < tail) {
        mid = (head + tail) >> 1; // 右移
        if (arr[mid] == key) { // 找到了
            return mid;
        }
        if (arr[mid] < key) { // 未找到
            head = mid + 1;
        } else {
            tail = mid;
        }
    }
    return -1;  // 没找到,返回-1
}

// 递归版本
int binary_search_v3(int *arr, int i, int n, int key) {
    int head = i, tail = n - 1, mid; // 左闭右闭
    // 失败出口
    if (head > tail) {
        return -1;
    }
    mid = (head + tail) >> 1;
    if (arr[mid] == key) { // 找到了
        return mid; // 返回待查找数的下标
    }
    if (arr[mid] < key) { // 未找到 
        head = mid + 1;
    } else {
        tail = mid - 1;
    }
    return binary_search_v3(arr, head, tail + 1, key);
}

int search(int *nums, int numsSize, int target) {
    return binary_search_v1(nums, numsSize, target);
    // return binary_search_v2(nums, numsSize, target);
    // return binary_search_v3(nums, 0, numsSize, target);
}

4. 寻找比目标字母大的最小字母


​​​​​​​

代码实现:

int binary_search(char *arr, int n, char key) {
    int head = 0, tail = n - 1, mid; // 左闭右闭
    while (head <= tail) {
        mid = (head + tail) >> 1; // 右移
        if (arr[mid] == key) { // 找到了
            return mid;
        }
        if (arr[mid] < key) { // 未找到
            head = mid + 1;
        } else {
            tail = mid - 1;
        }
    }
    return -1;  // 没找到,返回-1
}

char nextGreatestLetter(char *letters, int lettersSize, char target) {
    for (char i = target + 1; i <= 'z'; i++) {
        int ind = binary_search(letters, lettersSize, i);
        if (ind != -1) {
            return letters[ind];
        }
    }
    return letters[0];
}

5. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1859425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

viper:一款中国人写的红队服务器——记一次内网穿透练习

1. viper Viper 是中国人自主编写的一款红队服务器&#xff0c;提供图形化的操作界面&#xff0c;让用户使用浏览器即可进行内网渗透&#xff0c;发布在语雀官方地址 提供了很全面的官方文档&#xff0c;包括四大部分&#xff0c;分别是使用手册、模块文档、博客文章、开发手册…

高中数学:数列-错位相减法与裂项相消法求数列的和

一、错位相减法 设&#xff0c;an是等差数列&#xff0c;bn是等比数列&#xff0c;那么{an*bn}构成一个新的数列 这个新数列的求和公式&#xff0c;就可以用错位相减法求解。 练习 例题1 解析&#xff1a; 第一问 第二问 二、裂项相消法 1、裂项的几种常见形式 形式1…

Junit4测试基本应用(白盒测试)

Junit4测试基本应用&#xff08;白盒测试&#xff09; 一、实验目的 掌握Junit的基本操作&#xff0c;进行较简单的单元测试。 二、Junit4测试的使用 1. 创建java项目JUnitText 我使用的Eclipse&#xff0c;在左侧Package Explorer(包资源管理器)右键&#xff0c;新建Java …

物联网 IoT 收录

物联网IoT日常知识收录 thingsboard, nodered是国际大品牌&#xff0c; iotgateway是国内的&#xff0c; 几个scada, pyscada, json-scada都还不错&#xff0c;比较一下。thingsboard-gateway是python系的&#xff0c;如果你愿意&#xff0c;可以用这个作为公司的物联网网关。…

全网最强剖析Spring AOP底层原理

相信各位读者对于Spring AOP的理解都是一知半解&#xff0c;只懂使用&#xff0c;却不懂原理。网上关于Spring AOP的讲解层出不穷&#xff0c;但是易于理解&#xff0c;让人真正掌握原理的文章屈指可数。笔者针对这一痛点需求&#xff0c;决定写一篇关于Spring AOP原理的优质博…

视频监控解决方案:视频平台升级技术方案(下)

目录 1 项目概况 2 项目需求 2.1 视频感知资源扩充 2.2 视频支撑能力升级 2.3 视频应用能力升级 3 技术设计方案 3.1系统总体架构 3.2视频感知资源扩充设计 3.3 视频支撑能力升级设计 3.4 视频应用能力升级设计 3.4.1视频资源目录管理 3.4.2标签管理 3.4.3设备智能…

万亿国债野外图传——天通卫星图传设备类目推荐

在远离都市喧嚣的辽阔自然中&#xff0c;户外工业作业以其独特的重要性日益凸显&#xff0c;涵盖了从高山峻岭的地质勘探、森林资源调查到广袤草原的生态监测等众多领域。然而传统监测方法不能全面覆盖&#xff0c;冰雪覆盖的山区和偏远地区的电力设施状况以及野生动物等户外状…

多功能推拉力测试机可实现焊球推力测试

LB-8100A 多功能推拉力测试机广泛应于与 LED 封装测试、IC 半导体封 装测试、TO 封装测试、IGBT 功率模块封装测试、光电子元器件封装测试、汽 车领域、航天航空领域、军工产品测试、研究机构的测试及各类院校的测试 研究等应用。 多功能推拉力测试机设置主要结构&#xff1a;…

DDD(data display debugger)调试工具

文章目录 DDD安装界面说明 DDD data display debugger是命令行调试程序&#xff0c;可以理解为可视化的GDB。 安装 CentOS下使用以下命令进行安装&#xff1a; yum install ddd等待安装完成即可。 界面说明 顺便写一个测试程序&#xff0c;编译可执行文件 终端命令行输入…

51单片机STC89C52RC——7.1 串口通信

目的/效果 实现单片机串口与电脑串口工具进行数据通讯&#xff0c; 1&#xff1a;设备向电脑串口发送HEX 2&#xff1a;让电脑串口工具控制单片机LED亮灭。同时让单片机反馈控制的结果。 一&#xff0c;STC单片机模块 二&#xff0c;串口通讯 2.1 串行通信与并行通信 &…

智心顾问:为心智障碍家庭带来温暖与专业支持

&#x1f499;关爱从心开始 —— 理解心智障碍 在这个世界上&#xff0c;有这样一群特殊的群体——心智障碍者。他们通常伴随着个体认知、社会互动和学习能力的障碍。这些障碍可能源于遗传、环境或未知因素&#xff0c;但不应成为他们照护者获得信息和支持的阻碍。心智障碍者的…

webStorm debug vue项目的两种方法

一、前言 本文将介绍通过webstorm对vue项目进行debugger调试的三种方案。 但是&#xff0c;不管通过那种方案&#xff0c;都无法达到类似后端idea调试的体验&#xff0c;感觉十分难受&#xff0c;不过&#xff0c;比起用console.log还是好一些。如果各位有更好的方案&#xf…

【本地知识库】本地知识库+语言大模型=知域问答

本地知识库语言大模型知域问答 本项目实质为本地知识库构建及应用&#xff0c;内容包含&#xff1a; 本地知识库构建及应用相关知识的介绍离线式本地知识库构建及应用在线式本地知识库构建及应用 本地知识库构建及应用相关知识的介绍 本地知识库 本地知识库通常是指存储在…

免费悬浮翻译器都有哪些?看剧学习都适配的翻译器分享~

不知道大家有没有设想过&#xff0c;当我们在查阅外文文档或是观看外语电影时&#xff0c;要是能够借助翻译工具来同步获取译文&#xff0c;那得有多快乐~ 不瞒大家说&#xff0c;现在想要实现这种快乐其实很简单&#xff01;只要手里头备好几个趁手的免费悬浮翻译器就可以搞定…

为冲刺IPO,喜马拉雅曝裁员20%?钉钉叶军吐槽百度搜索;美国制裁俄罗斯安全软件12名高管;华为自研语言仓颉力战Java

一、商业圈 1.钉钉总裁叶军吐槽百度搜索&#xff1a;前十条都是广告 钉钉总裁叶军在亚布力中国企业家论坛第十届创新年会上发表了演讲&#xff0c;期间他直言不讳地对百度搜索提出了批评。叶军指出&#xff0c;在OpenAI推出智能聊天机器人ChatGPT之后&#xff0c;百度的传统搜…

昇思25天学习打卡营第1天|基本介绍

今天的课程内容是MindSpore和昇腾AI全栈的整体介绍。 MindSpore 介绍 全场景深度学习框架 架构结构 扩展部分 Model Zoo 模型库Extend 扩展库&#xff08;强化学习/GNN&#xff09;Sciene 科学计算 开放部分MindExpression 统一API第三方前端 运行部分Data 数据处理AI编译…

k8s知识点

Kubernetes中Service、Ingress与Ingress Controller的作用与关系 Service 是对一组提供相同功能的 Pods 的抽象&#xff0c;并为它们提供一个统一的入口。借助 Service&#xff0c;应用可以方便的实现服务发现与负载均衡。Ingress 是反向代理规则&#xff0c;管理外部流量进入集…

环境安装-GIT

下载 git官网下载 https://git-scm.com/ 安装 点击下载的安装包&#xff0c;并点击下一步 选择安装路径&#xff0c;照例改选自定义路径 选择默认的即可 选择GIT编辑器&#xff0c;默认选择vim即可 设置初始化新项目(本地仓库)的主分支名&#xff0c;按默认即可&#xff0c;点…

web前端:作业四

1.编写一个函数&#xff0c;形参是一个数组&#xff0c;返回数组中所有数字的平均值 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>// 1.编写一个函数&#xff0…

基于Pytorch框架构建AlexNet模型

Pytorch 一、判断环境1.导入必要的库2.判断环境 二、定义字典1.定义字典 三、处理图像数据集1.导入必要的模块2.定义变量3.删除隐藏文件/文件夹 四、加载数据集1.加载训练数据集2.加载测试数据集3.定义训练数据集和测试集路径4.加载训练集和测试集5.创建训练集和测试集数据加载…