美文网首页
二分查找升序序列

二分查找升序序列

作者: 恋恋风辰 | 来源:发表于2022-03-03 11:57 被阅读0次

问题描述

有一个连续的int数组,数组中的数据升序排序,数组中的数据不唯一,有重复数据,要求在数组中查找指定值为target的数据,返回target最小的下标,如果找到返回其最小的下标,如果没有找到,返回-1, 要求用 用二分查找的方式解决上述问题, 要求时间复杂度为Olog(n),空间复杂度为O(1)

举例 数组nums = [0,1,1,3,3,4], 查找target为1的数据最小的下标则返回1。如果查找target为100,则返回-1

解决思路

用二分查找解决上述问题,用一个数组中间的数据和target比较,如果中间值比target小,则说明target在中间值右侧。
如果中间值比target大,则说明target在中间值左侧。
如果中间值和target相等,则找到该target的位置,但是由于target不唯一,所以要向左移动,找到target最小的下标。

编码

将上边的逻辑实现如下

int binary_search(int nums[], int begin, int end, int target)
{
    //只要有一个越界就是没找到
    if (begin < 0 || begin > end || end < 0)
    {
        return -1;
    }

    //找到中间值比较
    int mid = (begin + end) / 2;
    // cout << "mid is " << mid << endl;
    //要找到的target在右半部分
    if (target > nums[mid])
    {
        return binary_search(nums, mid + 1, end, target);
    }

    //要找到的target在左半部分
    if (target < nums[mid])
    {
        return binary_search(nums, begin, mid - 1, target);
    }
    // cout << "nums[mid] is " << nums[mid] << endl;
    //如果找到target相等的元素,需要向左移动找到最小索引
    for (int i = mid; i > begin; i--)
    {
        if (target == nums[mid])
        {
            continue;
        }
        //   cout << "i is " << endl;
        return i + 1;
    }
}

在main函数中调用如下

int nums[] = {0, 1, 1, 3, 3, 4};
int find = binary_search(nums, 0, sizeof(nums) / sizeof(int) - 1, 3);
cout << "find is " << find << endl;
int find2 = binary_search(nums, 0, sizeof(nums) / sizeof(int) - 1, 4);
cout << "find is " << find2 << endl;
int find3 = binary_search(nums, 0, sizeof(nums) / sizeof(int) - 1, 0);
cout << "find is " << find3 << endl;

程序输出如下

find is 3
find is 5
find is 0

总结

本文实现了用二分查找的方式找到给定的target值
源码链接https://gitee.com/secondtonone1/algorithms
更多算法实现点击下方链接
https://llfc.club/category?catid=22zkaaQaS2wMZRygv3qQVpRKpXI

相关文章

  • 二分查找升序序列

    问题描述 有一个连续的int数组,数组中的数据升序排序,数组中的数据不唯一,有重复数据,要求在数组中查找指定值为t...

  • 二分查找

    **二分查找算法的前置条件是,一个已经排序好的序列(在本篇文章中为了说明问题的方便,假设这个序列是升序排列的),这...

  • python二分查找算法

    文章概述 二分查找法介绍 简单查找与二分查找对比 二分查找  二分查找算法主要思想:在有序列表中查找指定元素,先从...

  • 牛客网高频算法题系列-BM17-二分查找-I

    牛客网高频算法题系列-BM17-二分查找-I 题目描述 请实现无重复数字的升序数组的二分查找给定一个 元素升序的、...

  • LeetCode 力扣 109. 有序链表转换二叉搜索树

    题目描述(中等难度) 和 108 题 是一样的,都是给定一个升序序列,然后生成二分平衡查找树。区别在于 108 题...

  • 二分查找算法

    二分查找算法是什么 二分查找又叫折半查找,是一种简单又快速的查找算法;它对要查找的序列有两个要求,一是该序列必须是...

  • 二分查找

    数据顺序存储,有序序列 O(logn) 递归实现二分查找: 非递归实现二分查找:

  • 算法笔记(5)| 二分

    1.二分查找 二分查找是基于有序序列的查找算法,该算法一开始令[left,right]为整个序列的下标区间,然后每...

  • PHP的常用算法

    1、冒泡排序 2、快速排序 3、二分查找 假设数组是升序排列。

  • 旋转数组的最小数字(二分法查找)

    1.二分法查找。 思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,...

网友评论

      本文标题:二分查找升序序列

      本文链接:https://www.haomeiwen.com/subject/ejgyrrtx.html