首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA编程500例-005-02(入门级)

  • 25-03-03 08:01
  • 3143
  • 9403
blog.csdn.net

目录

1、二分查找(查找边界值): 

1-1、Python:

1-2、VBA:

2、相关文章:

Python算法之旅:http://iyenn.com/rec/1699032.html?spm=1001.2014.3001.5502 

个人主页:非风V非雨-CSDN博客

欢迎志同道合者一起交流学习,我的QQ:94509325/微信号

        二分查找(Binary search)是一种非常高效的查找算法,主要用于在有序数组中查找特定元素的位置。具体应用包括以下几种:

1、验证存在性:对于有序数组,可以使用二分查找来确定某个元素是否存在,如果存在则返回其索引,否则返回-1。

2、查找边界值:对于有序数组中包含重复元素的情况,可以使用二分查找来确定某个元素第一次或最后一次出现的位置。通过修改二分查找的判断条件,可以实现这个功能。

3. 查找插入位置:如果要向有序数组中插入一个元素,可以使用二分查找来确定插入的位置。如果元素已经存在,则返回其索引;如果元素不存在,则返回应该插入的位置。

4. 查找最接近的元素:对于有序数组,可以使用二分查找来找到最接近某个给定值的元素。通过不断缩小查找范围,并记录最接近的元素,最终可以找到目标元素。

总的来说,二分查找适用于在有序数组中进行查找、插入和判断等操作,可以快速确定元素的位置,提高查找效率。

 

1、二分查找(查找边界值): 
1-1、Python:
  1. # 1.问题描述:
  2. # 给定一个排序的整数数组和一个要查找的目标整数target,如果target不存在于数组中,返回-1;如果target存在于数组中,则返回target在数组中出现第1次和最后1次所在的位置.
  3. # 2.问题示例:
  4. # 输入数组[3,5,6,8,10,10,11,24]和目标整数10,则返回目标整数第1次、最后1次所在位置(4,5);输入数组[3,5,6,8,10,10,11,24]和目标整数7,则返回-1;
  5. # 输入数组[3,5,6,8,10,10,11,24]和目标整数8,则返回目标整数第1次所在位置3.
  6. # 3.代码实现:
  7. class Solution:
  8. def binary_Search_Bounds(nums, target):
  9. left, right = 0, len(nums) - 1
  10. first, last = -1, -1
  11. if target in nums:
  12. while left <= right:
  13. mid = (left + right) // 2
  14. if nums[mid] == target:
  15. first = mid
  16. while first > 0 and nums[first - 1] == target:
  17. first -= 1
  18. last = mid
  19. while last < len(nums) - 1 and nums[last + 1] == target:
  20. last += 1
  21. break
  22. elif nums[mid] < target:
  23. left = mid + 1
  24. else:
  25. right = mid - 1
  26. return (first, last) if first != last else first
  27. else:
  28. return -1
  29. # 主函数
  30. if __name__ == '__main__':
  31. solution =Solution()
  32. nums = [3, 5, 6, 8, 10, 10, 11, 24]
  33. target = 7
  34. target_position = Solution.binary_Search_Bounds(nums, target)
  35. print("输入:nums=", nums, " ", "target=", target)
  36. print("输出:", target_position)
  37. # 4.运行结果:
  38. # 输入:nums= [3, 5, 6, 8, 10, 10, 11, 24] target= 10
  39. # 输出: (4, 5)
  40. # 输入:nums= [3, 5, 6, 8, 10, 10, 11, 24] target= 7
  41. # 输出: -1
  42. # 输入:nums= [3, 5, 6, 8, 10, 10, 11, 24] target= 8
  43. # 输出: 3
1-2、VBA:
  1. Rem 自定义函数Binary_Search_Bounds,功能:查找目标整数在有序数组中出现的位置,若存在,且只出现了1次,则返回第1次出现的位置;若存在,且出现多次,则返回第1次、最后1次出现的位置;若不存在,则返回-1
  2. Function Binary_Search_Bounds(arr(), target As Integer) As Variant
  3. Dim firstPos As Integer
  4. Dim lastPos As Integer
  5. Dim i As Integer
  6. Dim found As Boolean
  7. firstPos = -1
  8. lastPos = -1
  9. found = False
  10. '查找第一次出现的位置
  11. For i = LBound(arr) To UBound(arr)
  12. If arr(i) = target Then
  13. firstPos = i
  14. found = True
  15. Exit For '如果只需要找到第一次出现的位置,可以在这退出循环
  16. End If
  17. Next i
  18. '如果找到了第一次出现的位置,继续查找最后一次出现的位置
  19. If found Then
  20. lastPos = firstPos
  21. For i = firstPos + 1 To UBound(arr)
  22. If arr(i) = target Then
  23. lastPos = i
  24. Else
  25. Exit For '一旦数组中的值不再等于目标值,就退出循环
  26. End If
  27. Next i
  28. End If
  29. '返回结果
  30. Binary_Search_Bounds = Array(firstPos, lastPos)
  31. End Function
  32. Rem 执行过程,功能:调用自定义函数Binary_Search_Bounds,并以弹窗方式输出结果
  33. Sub TestRun()
  34. Dim arr() As Variant
  35. Dim result As Variant
  36. Dim target As Integer
  37. ' 初始化数组
  38. arr = Array(3, 5, 6, 8, 10, 10, 11, 24)
  39. target = CInt(Application.InputBox("请输入目标整数:", "目标整数输入"))
  40. If target = False Then Exit Sub
  41. Select Case target
  42. Case Is = 3, 5, 6, 8, 11, 24
  43. result = Binary_Search_Bounds(arr, target)
  44. MsgBox "目标整数 " & target & " 出现在位置 " & result(0)
  45. Case Is = 10
  46. result = Binary_Search_Bounds(arr, target)
  47. MsgBox "目标整数 " & target & " 第一次出现和最后一次出现的位置分别是(" & result(0) & ", " & result(1) & ")"
  48. Case Else
  49. MsgBox "目标整数 " & target & " 不在数组中,返回-1"
  50. End Select
  51. End Sub

 注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行TestRun程序,以弹窗方式展示结果。

2、相关文章:

2-1、Python-VBA编程500例-004(入门级)

2-2、Python-VBA编程500例-005-01(入门级)

2-3、Python-VBA编程500例-006(入门级) 

2-4、Python-VBA编程500例-007(入门级)

Python算法之旅:http://iyenn.com/rec/1699032.html?spm=1001.2014.3001.5502 
个人主页:非风V非雨-CSDN博客
欢迎志同道合者一起交流学习,我的QQ:94509325/微信号:

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览60120 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://blog.csdn.net/ygb_1024/article/details/136720252"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top