• LeetCode刷题(python版)——Topic81. 搜索旋转排序数组 II


    一、题设

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。

    在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。

    给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。

    你必须尽可能减少整个操作步骤。

    示例 1:

    输入:nums = [2,5,6,0,0,1,2], target = 0
    输出:true
    

    示例 2:

    输入:nums = [2,5,6,0,0,1,2], target = 3
    输出:false

    二、基本思路

            大体是折半的思想,通常左右指针分别指向数组左右两端,有以下几种情况:

            1.若nums[mid] == nums[left]:此时mid下标处和第一个数相同,比较不了哪个数组是有序的,从而使left自加跳过这个数判断下个数。例如nums = [2,3,2,2,2],此时应是后半段[mid,right]有序,那么跳到3比较,转3.

            2.若nums[mid] > nums[left]:此时前半段[left,mid]有序,再去判断target是否在这个范围,若right = mid -1(去前半段找);若不在,则left = mid + 1(去后半段找). 

            3.若nums[mid] < nums[left]:此时后半段[mid,right]有序,再去判断target是否在这个范围,若left = mid +1(去后半段找);若不在,则right = mid - 1(去前半段找). 

            这题同Topic33搜索旋转排序数组.

    三、代码实现

    1. class Solution(object):
    2. def search(self, nums, target):
    3. left , right = 0 ,len(nums)-1
    4. while left <= right:
    5. mid = (left + right) // 2
    6. if nums[mid] == target:
    7. return True
    8. if nums[left] == nums[mid]:#判断不了前后哪个有序
    9. left += 1
    10. continue
    11. elif nums[mid] > nums[left]:# 前半截有序
    12. if nums[left] <= target < nums[mid]:
    13. right = mid - 1
    14. else:
    15. left = mid + 1 # 后半截有序
    16. else:
    17. if nums[mid] <= target <= nums[right]:
    18. left = mid + 1
    19. else:
    20. right = mid - 1
    21. return False

    四、效率总结

     

  • 相关阅读:
    电力通信专业技术总结,智能电网通信技术总结
    不知道视频怎样提取音频?这里有详细教程分享
    JS 实现AES方式加密数据实现示例
    Nginx优化
    踩坑List.addAll抛出UnsupportedOperationException
    vue3基础流程
    Java网关的统一异常处理
    Java clone()方法 与 Cloneable接口详解
    云安全(1)--初识容器逃逸之特权容器逃逸
    java计算机毕业设计建筑劳务监管平台MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/weixin_54039182/article/details/127961203