【python/M/154】Find Minimum in Rotated Sorted Array II

本文介绍了一种在旋转排序数组中寻找最小值的方法,特别关注了数组元素可能重复的情况。通过判断数组是否旋转及使用二分查找法,提供了一个有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在这里插入图片描述

实现思路

和153不同的地方在于,这个题目中的数字是有重复的。

实现代码

class Solution(object):
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # 判断是否有旋转
        if len(nums) == 1 or nums[0] < nums[-1]:
            return nums[0]
        
        start,end = 0,len(nums)-1
        
        while start+1 < end:
            mid = start + (end - start) // 2
            
            if nums[mid] == nums[end]:
                end -= 1
            elif nums[mid] < nums[end]:
                end = mid
            else:
                start = mid
        
        return min(nums[start],nums[end])
    
        
### Python 实现 SIFT 或 ORB 特征检测与匹配 在计算机视觉领域,SIFT(Scale-Invariant Feature Transform)和 ORB(Oriented FAST and Rotated BRIEF)是两种常用的特征检测与匹配算法。虽然 SIFT 是一种经典的算法,但由于其专利限制,在较新的 OpenCV 版本中已被移除。因此推荐使用 ORB 算法作为替代方案之一。 下面分别介绍如何使用这两种算法来实现图像的特征检测与匹配。 --- #### **一、SIFT 特征检测与匹配** 由于 SIFT 已经被申请了专利保护,现代版本的 OpenCV 不再提供内置支持。如果需要使用 SIFT,则需安装旧版 OpenCV 或者通过第三方库如 `opencv-contrib-python` 安装扩展模块[^3]。 ##### 代码示例: ```python import cv2 import matplotlib.pyplot as plt # 加载两张图片并转换为灰度图 image1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE) image2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE) # 初始化 SIFT 检测器 sift = cv2.SIFT_create() # 计算关键点和描述符 keypoints_1, descriptors_1 = sift.detectAndCompute(image1, None) keypoints_2, descriptors_2 = sift.detectAndCompute(image2, None) print(f'两幅图像提取的 SIFT 关键点数量分别为:{len(keypoints_1)} 和 {len(keypoints_2)}') # 创建 BFMatcher 对象 bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True) # 匹配描述符 matches = bf.match(descriptors_1, descriptors_2) # 根据距离筛选最佳匹配 matches = sorted(matches, key=lambda x: x.distance)[:50] # 绘制匹配结果 result = cv2.drawMatches( image1, keypoints_1, image2, keypoints_2, matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS ) plt.figure(figsize=(10, 8)) plt.imshow(result, cmap='gray'), plt.title("SIFT Matches"), plt.axis('off') plt.show() ``` 上述代码展示了如何使用 SIFT 提取关键点及其描述符,并通过暴力匹配(Brute Force Matching)找到最优匹配对[^2]。 --- #### **二、ORB 特征检测与匹配** 相比 SIFT,ORB 更加高效且无需担心专利问题。它是基于 FAST 角点检测和 BRIEF 描述子设计而成的一种快速特征检测方法[^1]。 ##### 代码示例: ```python import cv2 import matplotlib.pyplot as plt # 加载两张图片并转换为灰度图 image1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE) image2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE) # 初始化 ORB 检测器 orb = cv2.ORB_create() # 计算关键点和描述符 keypoints_1, descriptors_1 = orb.detectAndCompute(image1, None) keypoints_2, descriptors_2 = orb.detectAndCompute(image2, None) print(f'两幅图像提取的 ORB 关键点数量分别为:{len(keypoints_1)} 和 {len(keypoints_2)}') # 创建 BFMatcher 对象 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 匹配描述符 matches = bf.match(descriptors_1, descriptors_2) # 根据距离筛选最佳匹配 matches = sorted(matches, key=lambda x: x.distance)[:50] # 绘制匹配结果 result = cv2.drawMatches( image1, keypoints_1, image2, keypoints_2, matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS ) plt.figure(figsize=(10, 8)) plt.imshow(result, cmap='gray'), plt.title("ORB Matches"), plt.axis('off') plt.show() ``` 在此部分中,我们采用 ORB 替代 SIFT 来完成相同任务。注意这里使用的是汉明距离(Hamming Distance),因为 ORB 的描述子是由二进制字符串构成的[^1]。 --- ### 总结 无论是选择 SIFT 还是 ORB 都取决于实际应用场景的要求。对于科研项目或者无专利约束环境可以选择性能更好的 SIFT;而对于工业应用或开源软件开发建议优先考虑轻量化且免费可用的 ORB 方案[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值