题目,顺序数组二分查找,若出现相同数值,返回其第一次出现的下标。
class Solution:
def search(self, nums, target: int):
if len(nums) == 0:
return -1
visited = [0 for i in range(len(nums))]
start = 0
end = len(nums) - 1
mid = (start + end) // 2
if mid < 0:
mid = 0
if mid > len(nums) - 1:
mid = len(nums) - 1
while nums[mid] != target:
visited[mid] = 1
if target < nums[mid]:
start = start
end = mid - 1
mid = (start + end) // 2
if mid < 0:
mid = 0
if visited[mid] == 1:
return -1
if target > nums[mid]:
start = mid + 1
end = end
mid = (start + end) // 2
if mid > len(nums) - 1:
mid = len(nums) - 1
if visited[mid] == 1:
return -1
while nums[mid] == nums[mid - 1] and mid > 0:
mid -= 1
return mid
这个思路应该科班出身的人都学过,不过需要注意的是下标的问题
其中,mic==(start+end)//2
代表mid下标取值向下取整。
此外,本题还要求返回相同值的第一个下标,所以最后加一个步骤:
while nums[mid] == nums[mid - 1] and mid > 0:
mid -= 1