704.二分查找

  1. 704.二分查找
    1. 704.1 题目
    2. 704.2 题解
      1. 遍历数组查找
      2. 二分查找
    3. 704.3 代码
    4. 704.4 运行结果

704.二分查找


704.1 题目

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

示例 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

提示:

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

704.2 题解

遍历数组查找

// 方法一:遍历数组查找
static int Search1(int[] nums, int target)
{
    for (int i = 0; i < nums.Length; i++)
    {
        if (nums[i] == target)
        {
            return i;
        }
    }

    return -1;
}

二分查找

// 方法二:二分查找
static int Search2(int[] nums, int target)
{
    // 初始化左右指针,表示搜索范围的起始和结束位置
    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
        {
            return mid;
        }
    }

    // 如果循环结束仍未找到目标值,返回 -1 表示目标值不存在
    return -1;
}

704.3 代码

using System;

class Program
{
    static void Main()
    {
        #region 题目

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

        // 示例 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

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

        #endregion

        #region 测试

        // 示例 1
        int[] nums1 = { -1, 0, 3, 5, 9, 12 };
        int target1 = 9;
        int result1 = Search1(nums1, target1);
        Console.WriteLine($"示例1 方法1 输出:{result1}");
        int result1_2 = Search2(nums1, target1);
        Console.WriteLine($"示例1 方法2 输出:{result1_2}");

        // 示例 2
        int[] nums2 = { -1, 0, 3, 5, 9, 12 };
        int target2 = 2;
        int result2 = Search1(nums2, target2);
        Console.WriteLine($"示例2 方法1 输出:{result2}");
        int result2_2 = Search2(nums2, target2);
        Console.WriteLine($"示例2 方法2 输出:{result2_2}");

        #endregion
    }

    #region 答案

    // 方法一:遍历数组查找
    static int Search1(int[] nums, int target)
    {
        for (int i = 0; i < nums.Length; i++)
        {
            if (nums[i] == target)
            {
                return i;
            }
        }

        return -1;
    }

    // 方法二:二分查找
    static int Search2(int[] nums, int target)
    {
        // 初始化左右指针,表示搜索范围的起始和结束位置
        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
            {
                return mid;
            }
        }

        // 如果循环结束仍未找到目标值,返回 -1 表示目标值不存在
        return -1;
    }

    #endregion
}

704.4 运行结果

示例1 方法1 输出:4
示例1 方法2 输出:4
示例2 方法1 输出:-1
示例2 方法2 输出:-1


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏