旋转数组的二分查找 代码重构 追求优雅的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
今天面试一个小伙问旋转数组的二分搜索,https://leetcode.cn/problems/search-in-rotated-sorted-array 我自己先写了一份代码如下,是不是觉得很丑陋,重复代码较多?
 
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        n = len(nums)
 
        def search_highest():
            l, r = 0, n - 1
            while l + 1 < r:
                mid = (l + r) // 2
                if nums[mid] > nums[0]:
                    l = mid
                else:
                    r = mid
             
            if nums[l] > nums[r]:
                return l           
            return r
 
        def bin_search(l, r):
            if l > r:
                return -1
 
            while l + 1 < r:
                mid = (l + r) // 2
                if nums[mid] < target:
                    l = mid
                else:
                    r = mid
             
            if nums[l] == target:
                return l        
            if nums[r] == target:  
                return r
            return -1
 
        index = search_highest()
        i = bin_search(0, index)       
        return i if i >= 0 else bin_search(index+1, n-1)  
 
 
重构后的代码如下,看起来优雅多了,核心是lambda函数的巧妙应用!
 
class Solution:
    def search(self, nums: List[int], target: int) -> int:           
        n = len(nums)
        cmp_func = lambda mid: nums[mid] > nums[0]
        cmp_func2 = lambda mid: nums[mid] < target
        ret_func = lambda l, r: l if nums[l] > nums[r] else r
        ret_func2 = lambda l, r: l if nums[l] == target else (r if nums[r] == target else -1)
 
        def bin_search(l, r, cmp, ret):
            if l > r:
                return -1
                 
            while l + 1 < r:
                mid = (l + r) // 2
                if cmp(mid):
                    l = mid
                else:
                    r = mid
 
            return ret(l, r)
 
        index = bin_search(0, n-1, cmp_func, ret_func)
        i = bin_search(0, index, cmp_func2, ret_func2)
        return i if i >= 0 else bin_search(index + 1, n - 1, cmp_func2, ret_func2)

  

posted @   bonelee  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2022-02-27 远控免杀技术-Veil免杀——AES、DES、Base64等各种混淆技术,安装的时候很大因为是交叉编译,此外,最新版叫veil了而不是veil-evasion
2021-02-27 机器学习中的丑小鸭定理——世界上不存 在相似性的客观标准,是不是意味着如果从基因上去识别差异就没有差异,而人类只能做到主观的模糊论断???孪生网络无解???
2021-02-27 回头看PAC 学习理论——样本数+模型复杂度(参数个数) 在多项式时间内完成训练 感觉小样本学习是伪需求???
2021-02-27 图卷积神经网络——咋感觉就是做词嵌入 然后给出分类结果呢 类似deepwalk+分类
2021-02-27 苏宁基于服务层知识图谱的真假告警判定——本质上就是数据标注后 看上报事件和标注的误报、非误报事件相似度来消噪
2018-02-27 leetcode 657. Judge Route Circle
2018-02-27 leetcode 461. Hamming Distance
点击右上角即可分享
微信分享提示