【无标题】

蓝桥杯备战打卡第一天
【二分查找】
二分查找(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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值