实现无重复数字的升序数组二分查找

请实现无重复数字的升序数组的二分查找

给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1

C++代码:

#include <iostream>
using namespace std;
//数组以升序排列时,二分法查找target
int binSearch(int nums[], int n,int target)
{
    int low, high, mid;
    low = 0;
    high = n - 1;
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (target < nums[mid])
            high = mid - 1;
        else if (target > nums[mid])
            low = mid + 1;
        else
            return mid;
    }
    return -1;
}
int main()
{
    int i, target, pos;
    int nums[10];
    
    cout << "请输入10个整数(升序):";
    for (i = 0; i < 10; i++)
        cin >> nums[i];

    cout << "请输入要查找的数:";
    cin >> target;

    pos = binSearch(nums, 10,target);
    if (pos < 0)
        cout << "未找到此数";
    else
        cout << target <<"在数组中的下标为:" << pos;
    return 0;
}

以下是一个实现了无重复数字的升序数组的二分查找的 Python 代码:

def binary_search(nums, target):
    """
    在升序数组 nums 中查找目标值 target。
    如果找到就返回下标,否则返回 -1。
    """
    n = len(nums)
    left, right = 0, n - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

在这个函数中,我们使用了标准的二分查找算法。算法思路是:设定左右两个指针(变量left和right),并计算它们的中点(变量mid),然后比较中点的值与目标值的大小关系,根据比较结果缩小搜索区间,最终找到目标值或者确定不存在。
由于已经说明了数组中元素是升序且无重复的,因此不必考虑元素重复或乱序的情况,只要按顺序进行二分查找即可。
请尝试是否解决了问题


def binary_search(nums, target):
    left, right = 0, len(nums) - 1   # 初始化左右边界
    while left <= right:
        mid = (left + right) // 2   # 计算中间位置
        if nums[mid] == target:     # 目标值等于中间值,直接返回mid
            return mid
        elif nums[mid] > target:    # 目标值可能在左边区间
            right = mid - 1
        else:                       # 目标值可能在右边区间
            left = mid + 1
    return -1                       # 未找到目标值,返回-1

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7666026
  • 这篇博客你也可以参考下:二分查找(给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。)
  • 除此之外, 这篇博客: 请实现有重复数字的升序数组的二分查找中的 给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 特别特别需要注意的一个地方,自己做题的时候就这个地方没有通过。即如果数组是int[] array = {1,2,2,3,4};我们查找元素为2的下标,因为2号元素也是2,所以返回的就是2,而不是我们想要的1,所以我们要把nums[mid] 和nums[mid - 1]做一个比较

    else if(nums[mid] == target){
           while(mid != 0 && nums[mid] == nums[mid - 1])
                mid--;
           return mid;
    }
    
    public class Main {
        public static void main(String[] args) {
            int[] array = {1,2,2,3,4};
            System.out.println(search(array, 2));
        }
        public static int search (int[] nums, int target) {
            if(nums == null || nums.length == 0){
                return -1;
            }
            // write code here
            int left = 0;
            int right = nums.length-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 if(nums[mid] == target){
                    while(mid != 0 && nums[mid] == nums[mid - 1])
                        mid--;
                    return mid;
                }
            }
            return -1;
        }
    }
    
    
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以回答该问题。

    实现无重复数字的升序数组二分查找:

    输入的参数要求是一个升序数组和要查找的数字。

    需要返回该数字在数组中的下标,如果不存在返回-1。

    具体的函数实现如下:

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

    示例代码如下:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int BinarySearch(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }
    
    int main() {
        vector<int> nums = {1, 2, 3, 4, 5, 6, 7};
        int target = 4;
        int index = BinarySearch(nums, target);
        cout << index << endl;
        return 0;
    }
    

    该代码实现了输入一个升序数组和一个要查找的数字,返回该数字在数组中的下标,如果不存在则返回-1。函数实现的思路是二分查找算法,时间复杂度为O(logn)。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

def binary_search(nums, target):
    def search(left, right):
        if left > right:
            return -1
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] > target:
            return search(left, mid - 1)
        else:
            return search(mid + 1, right)
    return search(0, len(nums) - 1)

nums = [1,2,3,5,7,9]
target = 7
print(binary_search(nums, target))

target = 4
print(binary_search(nums, target))