谁做响应式网站,最简单的wordpress主题,使用wordpress漏洞反弹shell,自己做的网站验证码出不来怎么二分查找模板题
一、题目要求
给定一个长度为n的非递减数组和一个数字target#xff0c;要求找到数组中第一个大于等于target的位置pos#xff0c;数组下标从 0 开始。如果不存在大于等于target的数字#xff0c;则输出 -1。
二、输入格式
第一行#xff1a;为两个正整…二分查找模板题
一、题目要求
给定一个长度为n的非递减数组和一个数字target要求找到数组中第一个大于等于target的位置pos数组下标从 0 开始。如果不存在大于等于target的数字则输出 -1。
二、输入格式
第一行为两个正整数n和target其中1≤n,target≤10^5。分别表示数组长度和要查询的数字。第二行为n个正整数a1,a2,...,an其中1≤ai≤10^5表示给定的非递减数组。
三、输出格式
输出数组中第一个大于等于target的位置pos如果不存在则输出 -1。
四、示例
输入 7 52 3 5 6 7 8 9 输出 2
暴力解法
一个一个试
二分查找
二分查找代码思路的通俗解释
一、整体目标
我们的目标是在一个非递减升序的整数数组中找到第一个大于等于给定目标值target的元素的位置。如果不存在这样的元素则返回 -1。
二、初始化
首先我们有一个整数数组nums它的长度为n。我们设置两个指针left指向数组的第一个元素的位置初始值为 0right指向数组的最后一个元素的位置初始值为n - 1。 这就好比我们在一个有很多房间的长廊里找东西一开始left站在第一个房间门口right站在最后一个房间门口确定了我们的搜索范围是整个长廊。
三、循环查找
进入一个循环只要left小于right就一直循环下去。 这个循环就像是我们在不断缩小搜索范围直到找到目标或者确定目标不存在。 在循环中计算中间位置mid计算公式是mid left (right - left) // 2。 这就相当于我们每次都把长廊分成两部分然后去中间的那个房间看看。 如果中间位置的元素nums[mid]小于目标值target说明目标值如果存在的话一定在mid的右边。所以我们把left更新为mid 1这样就缩小了搜索范围到右边的部分。 就像我们确定目标不在左边这一半长廊了于是left走到了原来中间那个房间的右边一个房间继续搜索右边的长廊。 如果中间位置的元素nums[mid]大于等于目标值target说明目标值如果存在的话一定在mid的左边或者就是mid本身。所以我们把right更新为mid这样就缩小了搜索范围到左边的部分。 这时候我们觉得目标可能在左边这一半长廊于是right走到了原来中间那个房间继续搜索左边的长廊。
四、确定结果
当循环结束时也就是left和right相等或者left大于right了。这时候我们检查left位置的元素是否大于等于目标值。 如果是说明我们找到了第一个大于等于目标值的位置就是left。如果不是说明数组中不存在大于等于目标值的元素就返回 -1。
n, target map(int, input().split())
nums list(map(int, input().split()))left, right 0, n - 1
while left right:mid left (right - left) // 2if nums[mid] target:left mid 1else:right mid
if nums[left] target:print(left)
else:print(-1)二分查找适用于以下几种情况
有序数据查找元素数据是有序排列的要查找特定元素能高效定位时间复杂度为 O ( l o g n ) O(log n) O(logn)比线性查找的 O ( n ) O(n) O(n)快很多。查找边界值在单调变化递增或递减的数据中找满足某个条件的边界值比如满足某个不等式的最小或最大数值。动态规划优化在动态规划问题里用于优化状态转移过程快速查找满足条件的区间内元素。广范围数据搜索数据分布范围广二分查找可以缩小搜索区间快速定位目标或目标区间避免大量无效搜索。