菜农作业:
题目:
704. 二分查找https://leetcode.cn/problems/binary-search/
给定一个 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
以上题目转载于LeetCode:
704. 二分查找 - 力扣(LeetCode)https://leetcode.cn/problems/binary-search/
首先我们判断这道题中,target可能出现的情况:
1. target在数列内:(循环输出即可)
2. target不在数列内:(1. 小于List[0] 2. 大于 List[len(nums) - 1] 3. 范围在数列内,但不属于数列)
这道题可以枚举,代码如下:(python3)
class Solution:
def search(self, nums: List[int], target: int) -> int:
itemIndex = -1
l = len(nums)
if nums[0] > target:
return -1
elif nums[-1] < target:
return -1
else:
for itemNo in range(l):
if nums[itemNo] < target:
itemIndex += 1
elif nums[itemNo] == target:
itemIndex += 1
return itemIndex
else:
return -1
也可以使用二分法,代码如下:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
使用二分法就可以不用再考虑头尾的问题了,只需要判断其在不在列表内,如果不在,直接输出 -1。
该二分法用的是“左右全包”。有关于二分法的详细内容放在以下连接中: