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=0l, r = 0, len(nums) - 1while l <= r:mid = (l + r) // 2if nums[mid] == target:print(mid)if nums[0] <= nums[mid]:if nums[0] <= target < nums[mid]:r = mid - 1else:l = mid + 1else:if nums[mid] < target <= nums[len(nums) - 1]:l = mid + 1else:r = mid – 1print(-1)结语通过二分法查找,要查找的数是中间数时,只要一次就能找到,最差的情况就是n/2=0,n为数组长度,但最后等于0时要么找到要么没有找到,总的来说比冒泡排序效率高,不需要一个一个找。这只是对二分法的初步了解,之后将深度综合学习。实习编辑:李欣容稿件来源:深度学习与文旅应用实验室(DLETA)

(0)

相关推荐

  • Leetcode刷题 2021.01.24

    Leetcode674 最长连续递增序列 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度. 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于 ...

  • 漫画:知乎面试题(旋转数组最小值Ⅰ

    今天是小浩算法"365刷题计划"第71天.继续为大家讲解二分查找,分享一道知乎面试题.话不多说,直接看题. 01 PART 旋转排序数组最小值Ⅰ 这道题目有两个版本,一道简单,一道 ...

  • LeetCode 热题 HOT 100

    LeetCode 热题 HOT 100

  • (1条消息) 两数之和,程序员才懂的 TwoSum 和 Abandon !

    (1条消息) 两数之和,程序员才懂的 TwoSum 和 Abandon !

  • ​LeetCode刷题实战312:戳气球

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • ​LeetCode刷题实战41:缺失的第一个正数

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • 七大排序算法总结

    以下所有动图均来源于一像素博客园 以下代码均使用C 编写 完整代码请到这里下载 稳定排序算法:冒泡排序.插入排序.归并排序 时间复杂度不受数据影响:选择排序.归并排序.堆排序 时间复杂度基本小于n2: ...

  • 漫画:知乎面试题(旋转数组最小值Ⅱ

    今天是小浩算法"365刷题计划"第72天.继续为大家讲解二分法系列篇 - 旋转排序数组最小值Ⅱ(进阶版).话不多说,直接看题: 01 PART 旋转排序数组最小值Ⅱ 昨天为大家讲解 ...

  • 剑指offer

    03 数组中重复的数字 public int findRepeatNumber(int[] nums){ //排序后的数组,重复元素必然相邻 Arrays.sort(nums); //结果集 int ...

  • ​LeetCode刷题实战283:移动零

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...