算法训练 第四周

编程入门 行业动态 更新时间:2024-10-21 15:49:49

<a href=https://www.elefans.com/category/jswz/34/1770096.html style=算法训练 第四周"/>

算法训练 第四周

一、二分查找


本题给我们提供了一个有n个元素的升序整形数组nums和一个目标值target,要求我们找到target在nums数组中的位置,并返回下标,如果不存在目标值则返回-1。nums中的所有元素不重复,n将在[1,10000]之间,nums的每个元素都将在[-9999,9999]之间。本题我们将不会使用简单的遍历查找方法,而是会使用二分查找这种更加高效的方法。

1.二分法

如果要使用二分法我们先得保证被查找的数组是有序的,而本题正好是一个升序数组,对于这样一个升序数组我们就可以使用二分法了。对于nums数组中的每一个元素都可能会出现三种情况:

  • 如果 nums[i]=target,则下标i即为要寻找的下标;

  • 如果 nums[i]>target,则target只可能在下标i的左侧;

  • 如果 nums[i]<target,则target只可能在下标i的右侧。

通过以上特征我们就可以进行二分查找了,我们先定义两个指针left,right分别指向数组的左边界和右边界,然后在每次查找的过程中,我们都选取左右边界的中点mid,比较target和nums[mid]的大小,如果相等则说明找到了目标值,此时我们需要的下标就是mid,如果nums[mid]大于target说明目标值在整个查找范围的左半部分,此时我们需要将right更新为mid - 1,此时就将查找范围缩减了一半,如果nums[mid]小于target此时和上述过程同理。我们不断地进行以上过程,最终就会找到目标值的下标,如果在left大于right之后还没有找到target就说明nums中不存在目标值,此时返回-1,具体代码如下:

int search(int* nums, int numsSize, int target)
{int left,right;left = 0;right = numsSize - 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;}}return -1;
}
复杂度分析
  • 时间复杂度:O(log⁡n),其中 n 是数组的长度。

  • 空间复杂度:O(1)。

更多推荐

算法训练 第四周

本文发布于:2023-12-03 17:07:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1656908.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:算法

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!