Python | 你好,二分法
Posted 算法与编程之美
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python | 你好,二分法相关的知识,希望对你有一定的参考价值。
本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。
引言
二分法指的是数学领域的概念,用二分法求函数f(x)零点近似值,这一思想也经常用于计算机中的查找过程中。尤其是当数据量很大适宜采用该方法。
二分法查找的思路:(要求数组按升序排列)
1.首先,从数组的中间开始查找,如果该元素就是目标元素,则查找结束,否则继续下一步。
2.对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数组的前半段中查找;若x大于当前位置值则在数组的后半段中继续查找,直到找到为止。
3.如果某一步数组为空,则表示找不到目标元素。
假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量left,mid,right分别指向数据的左,中间和右,mid=(left+right)/2。
问题描述
这是力扣的一题,整数数组 nums 按升序排列,数组中的值互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你旋转后的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:
输入:nums = [1], target = 0
输出:-1
解决方案
二分法解答,查找目标值。用while循环,遍历数组,再找到中间数,将数组分割为两部分,如果中间数是目标数,则跳出循环,输出该数的下标。若不是目标数,就与目标数作比较,注意旋转后的数组是无序的,但部分是有序的,需要再做一次判断,找到目标值所在区间,如果 [l, mid ] 是有序数组,且 target 满足(nums[0],nums[mid])则我们应该将搜索范围缩小至 [l, mid - 1],否则在 [mid + 1, r]。如果[mid, r]是有序数组且target 满足(nums[mid],nums[len(nums)-1]),则我们应该将搜索范围缩小至 [mid + 1, r],否则在 [l, mid - 1] 中寻找,若找不到目标值,输出-1。
附件
代码清单 1 DFS求解搜索旋转排序数组Python代码
nums=[4,5,6,7,0,1,2] target=0 l, r = 0, len(nums) - 1 while l <= r: mid = (l + r) // 2 if nums[mid] == target: print(mid) if nums[0] <= nums[mid]: if nums[0] <= target < nums[mid]: r = mid - 1 else: l = mid + 1 else: if nums[mid] < target <= nums[len(nums) - 1]: l = mid + 1 else: r = mid – 1 print(-1) |
结语
通过二分法查找,要查找的数是中间数时,只要一次就能找到,最差的情况就是n/2=0,n为数组长度,但最后等于0时要么找到要么没有找到,总的来说比冒泡排序效率高,不需要一个一个找。这只是对二分法的初步了解,之后将深度综合学习。
实习编辑:李欣容
稿件来源:深度学习与文旅应用实验室(DLETA)
以上是关于Python | 你好,二分法的主要内容,如果未能解决你的问题,请参考以下文章