当前位置: 首页 > article >正文

Python世界:力扣题704二分查找

Python世界:力扣题704二分查找

    • 任务背景
    • 思路分析
    • 代码实现
    • 测试套件
    • 本文小结

任务背景


问题来自力扣题目704:Binary Search,大意如下:

Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.

You must write an algorithm with O(log n) runtime complexity.

翻译下,需求是:对有序数组进行查找指定数字,若有返回索引,若无返回-1.

思路分析


重温下二分写法,思路很简单,发现值大的下移上界,发现值小的上移下界,直到上下界重合。

要注意的是无target时,mid的偏移问题。

代码实现


class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        # range: [low, high)
        low = 0
        high = len(nums)
        while (low < high):
            mid = low + (high - low) // 2
            if nums[mid] < target:
                low = mid + 1
            elif nums[mid] > target:
                high = mid
            else:
                return mid
        # not found
        return -1

   
# test
nums = [-1, 0, 3, 5, 9, 12]
target = 9

# nums = [-1,0,3,5,9,12]
# target = 2

sol = Solution()
res = sol.search(nums, target)
print(res)

测试套件


# 导入单元测试
import unittest

# 编写测试套
class TestSol(unittest.TestCase):
    # 不在数组中
    def test_special1(self):
        nums = [-1, 0, 3, 5, 9, 12]
        target = 2
        ret = -1
        sol = Solution()
        self.assertEqual(sol.search(nums, target), ret)

    # 下边界
    def test_special2(self):
        nums = [-1, 0, 3, 5, 9, 12]
        target = -1
        ret = 0
        sol = Solution()
        self.assertEqual(sol.search(nums, target), ret)

    # 上边界
    def test_special3(self):
        nums = [-1, 0, 3, 5, 9, 12]
        target = 12
        ret = 5
        sol = Solution()
        self.assertEqual(sol.search(nums, target), ret)

    def test_common1(self):
        nums = [-1, 0, 3, 5, 9, 12]
        target = 5
        ret = 3
        sol = Solution()
        self.assertEqual(sol.search(nums, target), ret)

    def test_common2(self):
        nums = [-1, 0, 3, 5, 9, 12]
        target = 9
        ret = 4
        sol = Solution()
        self.assertEqual(sol.search(nums, target), ret)


# 含测试套版本主调
if __name__ == '__main__':
    print('start!')
    unittest.main() # 启动单元测试
    print('done!')

本文小结


二分核心:索引偏移存乎一心。

可进一步思考若有重复值时,如何找到最小重复索引或最大重复索引。


http://www.kler.cn/a/386051.html

相关文章:

  • Ubuntu20.04 解决一段时间后键盘卡死的问题 ubuntu
  • Cellebrite VS IOS18Rebooting
  • 在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5
  • SQL面试题——蚂蚁SQL面试题 连续3天减少碳排放量不低于100的用户
  • 基于ECS实例搭建Hadoop环境
  • 38配置管理工具(如Ansible、Puppet、Chef)
  • 大型语言模型(LLMs)关键技术指南
  • 科技改变生活:最新智能开关、调光器及插座产品亮相
  • ElasticSearch学习篇16_《检索技术核心20讲》进阶篇之空间检索
  • 无人机影像处理系统技术选型
  • 云计算:定义、类型及对企业的影响
  • MATLAB filtic函数使用详解
  • Seata — 分布式事务
  • .Net IOC理解及代码实现
  • 开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二)
  • 阿里云aliyun gradle安装包下载地址
  • Kotlin-面向对象之构造函数、实例化和初始化
  • Vue3+axios+Vite配置Proxy代理解决跨域
  • 【spark面试题】RDD容错机制
  • 基于Jeecgboot3.6.3vue3的flowable流程增加online表单的审批支持(三)后端接口
  • 高效集成:聚水潭采购数据同步到MySQL
  • 【ARM Linux 系统稳定性分析入门及渐进 1.1 -- Crash 工具功能概述】
  • 浅谈智能家居在智慧养老实训室中的作用
  • 飞书 富文本(Markdown)
  • 【网络安全 | Java】AES加密算法
  • docker运行code-servre并配置https通信