leetcode 704.二分查找

39 阅读1分钟

704. 二分查找

简单

相关标签

premium lock icon相关企业

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果 target 存在返回下标,否则返回 -1

你必须编写一个具有 O(log n) 时间复杂度的算法。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

 

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

题解: 二分好设置,查找到就出结果,查找失败的条件不好写,缩小范围时候要不要包含中间值不好写。 修改过程: 1、找到情况未设置break退出循环; 2、high和Low未赋初值。

#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int n, m, i, target, low, high, mid;
    scanf ("%d", &n);
    low = 1;
    high = n;
    int* num = (int*)malloc(sizeof(int) * n + 1);
    num[0] = -1;
    for (i = 1;i <= n;i ++)
    {
        scanf ("%d", &num[i]);
    }
    scanf ("%d", &target);

    while (high >= low)
    {
        mid = (high + low) / 2;
        if (target == num[mid])
        {
            printf ("%d", mid);
            break;
        }
        else if (target > num[mid])
        {
            low = mid + 1;
        }
        else if (target < num[mid])
        {
            high = mid - 1;
        }
    }

    if (high < low)
    {
        printf ("%d", num[0]);
    }

    return 0;
}