蓝桥杯备战打卡第一天
【二分查找】
二分查找(Binary Search)是一种效率较高的查找方式,它的时间复杂度为O(logn)。
二分查找要求数组按关键字有序排列,并设置两个指针left和right分别指向数组的开头和末尾,每次查找left和right的中间项[mid]。
设数组非递减排列:
1.若目标值target等于中间项[mid],则找到元素;
2.若目标值target小于中间项[mid],则前往当前范围的左半部分查找,将right置为mid-1;
3.若目标值target大于中间项[mid],则前往当前范围的右半部分查找,将left置为mid+1;
4.若指针left跑到了right的右边,代表数组已查询完毕,且数组中没有目标值。由此可得循环的结束条件为left>right。
实战
题目一:给定一个 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
def find(nums, targe):
left = 0
right = len(nunms) - 1
while left <= right:
if nums[mid] == target: #nums数组的第mid索引号元素值==target目标值
return mid
else nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return -1
题目二:在一个严格递减的数组中,找到第二个比目标值target大的数的下标。若不存在,则返回-1
def merge_find(nums, target):
left = 0
right = len(nums) - 1
while left <= right:
mid = (right - left) // 2 + left
if nums[mid] == target:
if mid - 2 >= 0:
return mid - 2
else:
return -1
elif nums[mid] > target:
left = mid + 1
else:
right = mid - 1
return -1
题目三:给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
def TowSum(numbers, target):
for a in numbers:
k = numbers.index(a) + 1
for b in numbers[k:]:
if a + b == target:
return sorted([numbers.index(a)+1, numbers.index(b)+1])
return -1
8819

被折叠的 条评论
为什么被折叠?



