• LeetCode数组类的题目提交记录 【2】


    /***********************************************************************
    33. Search in Rotated Sorted Array

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

    (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

    You are given a target value to search. If found in the array return its index, otherwise return -1.

    You may assume no duplicate exists in the array.


    eg: 

    0 1 2 3 4//右边有序情况
    4 0 1 2 3//右边有序情况
    3 4 0 1 2//右边有序情况

    2 3 4 0 1//左边有序情况
    1 2 3 4 0//左边有序情况
    **************************************************************/

    //代码提交1
    //循环法--查找
    
    int search(int* nums, int numsSize, int target) {
        int Left = 0;
        int Right = numsSize - 1;
        int Middle;
        while (Left <= Right)
        {
            Middle = (Left + Right) / 2;
    
            if (*(nums + Left) == target)
                return Left;
            if (*(nums + Right) == target)
                return Right;
            if (*(nums + Middle) == target)
                return Middle;
    
            if (*(nums + Left) < *(nums + Middle))
            {
                if (*(nums + Left) <= target && target < *(nums + Middle))
                    Right = Middle-1;
                else
                    Left = Middle + 1;
                continue;
            }
            else
            {
                if (*(nums + Middle) < target && target <= *(nums + Right))
                    Left = Middle + 1;
                else
                    Right = Middle-1;
                continue;
            }
    
        }
        return -1;
    }

      

    //代码提交2
    //递归法---查找
    int searchFun(int* nums, int nLeft,int nRight,int ntargrt) {
        int Left = nLeft;
        int Right = nRight;
        int Middle = (Left + Right) / 2;
    
        if (Left <= Right)
        {
            if (*(nums + Middle) == ntargrt) {
                return Middle;
            }
    
            if (*(nums + Middle) < *(nums + Right))
            {
                if (*(nums + Middle) < ntargrt && ntargrt <= *(nums + Right)) 
                {
                    Left = Middle + 1;
                    return searchFun(nums,Left,Right,ntargrt);
                }
                else            
                {
                    Right = Middle - 1;
                    return searchFun(nums, Left, Right, ntargrt);
                }
            }
    
            if (*(nums + Middle) > *(nums + Right)) 
            {
                if (*(nums + Middle) > ntargrt && ntargrt > *(nums + Right))
                {
                    Right = Middle - 1;
                    return searchFun(nums, Left, Right, ntargrt);
                }
                else 
                {
                    Left = Middle + 1;
                    return searchFun(nums, Left, Right, ntargrt);
                }
            }
    
            return -1;
        }
    
        return -1;
    }
    int search(int* nums, int numsSize, int target) {
        int Left = 0;
        int Right = numsSize - 1;
    
        int resultNum = searchFun(nums,Left,Right,target);
        return resultNum;
    }

    /***********************************************************************
    81. Search in Rotated Sorted Array II

    Follow up for "Search in Rotated Sorted Array":
    What if duplicates are allowed?

    Would this affect the run-time complexity? How and why?

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

    (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

    Write a function to determine if a given target is in the array.

    The array may contain duplicates.

    **************************************************************/

    bool search(int* nums, int numsSize, int target) {
        int Left = 0;
        int Right = numsSize - 1;
        int Middle;
        while (Left <= Right)
        {
            Middle = (Left + Right) / 2;
    
            if (*(nums + Left) == target)
                return true;
            if (*(nums + Right) == target)
                return true;
            if (*(nums + Middle) == target)
                return true;
    
            if (*(nums + Left) < *(nums + Middle))
            {
                if (*(nums + Left) <= target && target < *(nums + Middle))
                    Right = Middle - 1;
                else
                    Left = Middle + 1;
                continue;
            }
            else if (*(nums + Left) > *(nums + Middle))
            {
                if (*(nums + Middle) < target && target <= *(nums + Right))
                    Left = Middle + 1;
                else
                    Right = Middle - 1;
                continue;
            }
            else {//*(nums + Left) == *(nums + Middle)则跳过当前位置上的重复
                Left++;
            }
    
        }
        return false;
    }

      

  • 相关阅读:
    在一台服务器上搭建相对高可用HiveServer实践
    HDU 4462 Scaring the Birds (暴力求解,二进制法)
    HDU 4461 The Power of Xiangqi (水题)
    HDU 4460 Friend Chains (BFS,最长路径)
    UVaLive 7270 Osu! Master (统计)
    CodeForces 705C Thor (模拟+STL)
    CodeForces 705B Spider Man (水题)
    CodeForces 705A Hulk (水题)
    UVa 11971 Polygon (数学,转化)
    UVa 10900 So you want to be a 2n-aire? (概率DP,数学)
  • 原文地址:https://www.cnblogs.com/iamcdx-2017/p/8124372.html
Copyright © 2020-2023  润新知