【⼆分查找】⼆分查找(easy)
⼆分查找(easy)
- 题⽬描述:
- 算法流程:
- 算法代码:
- C
- JAVA
- 时间复杂度
题⽬链接:leetcode 704.⼆分查找
题⽬描述:
给定⼀个 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]之间。
算法流程:
- 定义 left , right 指针,分别指向数组的左右区间。
- 找到待查找区间的中间点 mid ,找到之后分三种情况讨论:
i. arr[mid] == target 说明正好找到,返回 mid 的值;
ii. arr[mid] > target 说明 [mid, right] 这段区间都是⼤于 target 的,因此舍去右边区间,在左边[left, mid -1] 的区间继续查找,即让 right = mid - 1 ,然后重复 2 过程;
iii. arr[mid] < target 说明 [left, mid] 这段区间的值都是⼩于 target 的,因此舍去左边区间,在右边 [mid + 1, right] 区间继续查找,即让 left = mid + 1 ,然后重复 2 过程; - 当 left 与 right 错开时,说明整个区间都没有这个数,返回 -1 。
算法代码:
C
int search(int* nums, int numsSize, int target){// 初始化 left 与 right 指针int left = 0, right = numsSize - 1;// 由于两个指针相交时,当前元素还未判断,因此需要取等号while (left <= right){// 先找到区间的中间元素int mid = left + (right - left) / 2;// 分三种情况讨论if (nums[mid] == target) return mid;else if (nums[mid] > target) right = mid - 1;else left = mid + 1;}// 如果程序⾛到这⾥,说明没有找到⽬标值,返回 -1return -1;
}
JAVA
class Solution {public int search(int[] nums, int target) {int left=0,right=nums.length-1;while(left<=right){int mid=left+(right-left)/2;if(nums[mid]>target){right=mid-1;}else if(nums[mid]<target){left=mid+1;}else return mid;}return -1;}
}
时间复杂度
O(logN)