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的偏移问题。

代码实现


python 复制代码
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)

测试套件


python 复制代码
# 导入单元测试
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!')

本文小结


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

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

相关推荐
lueluelue472 小时前
LeetCode:链表
算法·leetcode·链表
DLYSB_2 小时前
存储运维实战:基于 Ceph Event 监听与 Python 适配器的分布式存储健康度物理声光响应架构
运维·ceph·python·报警灯
阿童木写作2 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
隐积3 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
阿童木写作4 小时前
Python实现Temu图片批量翻译自动化教程
运维·人工智能·python·自动化
橘子汽水1685 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
就是一只白5 小时前
复制地理信息python版本
python
看浪的路人5 小时前
第1讲:Agent 到底是什么?和 Chatbot 有什么区别
python·ai
名字还没想好☜6 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
瓦学妹6 小时前
什么是网络索引?它是如何工作的?
大数据·网络·python·网络爬虫