zoukankan      html  css  js  c++  java
  • 搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。

    ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

    搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

    你可以假设数组中不存在重复的元素。

    你的算法时间复杂度必须是 O(log n) 级别。

    示例 1:

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

    示例 2:

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

    解题思路:

    题目要求 O(logN)O(logN)O(logN) 的时间复杂度,基本可以断定本题是需要使用二分查找,怎么分是关键。
    由于题目说数字了无重复,举个例子:
    1 2 3 4 5 6 7 可以大致分为两类,
    第一类 2 3 4 5 6 7 1 这种,也就是 nums[start] <= nums[mid]。此例子中就是 2 <= 5
    这种情况下,前半部分有序。因此如果 nums[start] <=target<nums[mid],则在前半部分找,否则去后半部分找。
    第二类 6 7 1 2 3 4 5 这种,也就是 nums[start] > nums[mid]。此例子中就是 6 > 2
    这种情况下,后半部分有序。因此如果 nums[mid] <target<=nums[end],则在后半部分找,否则去前半部分找。

    此题有个存在重复数字的变形题,可参考 此题解

    代码实现:

    int search(int* nums, int numsSize, int target){
        int start=0;
        int end=numsSize-1;
        int mid=0;
        while(start <=end){
                mid=start+(end-start)/2;
                if(nums[mid] == target)
                    return mid;
                if(nums[start] <=nums[mid]){
                        if(target >= nums[start]
                            && target < nums[mid]){
                                end=mid-1;
                            }else{
                                start=mid+1;
                            }
                }else{
                        if(target <=nums[end]
                            && target >nums[mid]){
                                start=mid+1;
                            }else{
                                end=mid-1;
                            }
                }
        }
        return -1;

    }
  • 相关阅读:
    浅析PostgreSQL的 ON CONFLICT 和 upsert:不存在则插入/存在则更新、upsert 介绍、语法及示例
    常见工作场景解决方案开源库推荐:文件上传库
    [转]Go-micro 服务端、客户端简单示例
    micro 与go-micro的区别
    【转】一篇文章说清楚 TDengine 的 FQDN
    【转】LV扩容(lvextend)
    [AWS] Launch configuration vs Launch template
    AcWing 867. 分解质因数
    AcWing 866. 试除法判定质数
    AcWing 861. 二分图的最大匹配
  • 原文地址:https://www.cnblogs.com/pigdragon/p/12521247.html
Copyright © 2011-2022 走看看