1、问题描述
给定一个排序的整数数组(升序)和一个要查找的目标整数 target ,如果在数组中找到 target,则返回 True,否则返回 False。
2、问题示例
输入数组 [ 1, 4, 4, 5, 7, 7, 8, 9, 9, 10 ] 和目标整数 1,输出 True,表示找到目标整数 1。
输入数组 [ 1, 2, 3, 3, 4, 5, 10 ] 和目标整数 3,输出 True,表示找到目标整数 3。
输入数组 [ 1, 2, 3, 3, 4, 5, 10 ] 和目标整数 6,输出 False,表示未找到目标整数 6。
3、代码实现
递归实现:
1)定义开始位置 start,值为数组第一个元素的下标 0,定义结束位置 end,值为搜索范围的最后一个元素的下标 len(nums) - 1;
2)如果 start 大于 end,即查找范围内的数据的第一个数据的下标位置大于最后一个数据的下标位置,表示该范围内的数据均已查找完且未查找到目标数据,搜索结束,返回 False;
3)取查找范围数据的中间值位置坐标 mid:
a、如果目标数据 target 等于该中间位置的数据 nums[mid],则表示已找到该数据,搜索结束,返回 True;
b、如果目标数据 target 小于该中间位置的数据 nums[mid],则表示 target 在 start 位置的数据与 mid - 1 位置的数据之间,则把 start 到 mid - 1 之间的数据 nums[ : mid ] 重新传入本函数,继续搜索,直到搜索结束为止;
c、如果目标数据 target 大于该中间位置的数据 nums[mid],则表示 target 在 mid + 1 位置的数据与 end 位置的数据之间,则把 mid + 1 到 end 之间的数据 nums[ mid + 1 : ] 重新传入本函数,继续搜索,直到搜索结束为止。
非递归实现:
1)定义开始位置 start,值为数组第一个元素的下标 0,定义结束位置 end,值为搜索范围的最后一个元素的下标 len(nums) - 1;
2)如果 start 大于 end,即查找范围内的数据的第一个数据的下标位置大于最后一个数据的下标位置,表示该范围内的数据均已查找完且未查找到目标数据,搜索结束,返回 False;
3)while 循环,当 start 小于或等于 end 时,取查找范围数据的中间值位置坐标 mid:
a、如果目标数据 target 等于该中间位置的数据 nums[mid],则表示已找到该数据,搜索结束,返回 True;
b、如果目标数据 target 小于该中间位置的数据 nums[mid],则表示 target 在 start 位置的数据与 mid - 1 位置的数据之间,则把 end 的值改为 mid - 1,重新 while 循环;
c、如果目标数据 target 大于该中间位置的数据 nums[mid],则表示 target 在 mid + 1 位置的数据与 end 位置的数据之间,则把 start 的值改为 mid + 1,重新 while 循环。
4)如果执行 while 循环 start 小于或等于 end 时,返回 True,则表示已找到该数据,搜索结束;
如果因 start 大于 end 导致 while 循环结束,则返回 False,表示数组的数据均已查找完且未查找到目标数据,搜索结束。
class Solution: def binarySearch_1(self, nums, target): # 递归实现 start = 0 end = len(nums) - 1 if start > end: return False mid = (start + end) // 2 if target == nums[mid]: return True elif target < nums[mid]: return self.binarySearch_1(nums[:mid], target) else: return self.binarySearch_1(nums[mid + 1:], target) def binarySearch_2(self, nums, target): # 非递归实现 start = 0 end = len(nums) - 1 while start <= end: mid = (start + end) // 2 if target == nums[mid]: return True elif target < nums[mid]: end = mid - 1 else: start = mid + 1 return False if __name__ == "__main__": nums = [1, 2, 3, 3, 4, 5, 10] target1 = 3 target2 = 6 solution = Solution() print("递归实现:") if solution.binarySearch_1(nums, target1): print("目标数据 {} 存在数组中!".format(target1)) else: print("目标数据 {} 不在数组中!".format(target1)) print("\n非递归实现:") if solution.binarySearch_2(nums, target2): print("目标数据 {} 存在数组中!".format(target2)) else: print("目标数据 {} 不在数组中!".format(target2))
5、二分查找
最新推荐文章于 2024-08-26 15:40:51 发布