在排序数组中查找元素的第一个和最后一个位置_leetcode_34

题目描述:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
分析:升序数组,可以用二分查找定位目标元素,然后左右跳动指针确定范围;
代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 //以上注释说明我们返回的数组需要自己用malloced函数创建;
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    int* array = malloc(2 * sizeof(int));	//创建int类型数组
    *returnSize=2;  //returnSize赋值为2
    if(numsSize==0){
        array[0]=-1;
        array[1]=-1;
    }else if(nums[0]==target && nums[numsSize-1]==target){
        array[0]=0;
        array[1]=numsSize-1;
    }else{
        int Head=0;
        int Tail=numsSize-1;
        int Mid;
        while(Head<=Tail){
            if(nums[Head]==target){
                while(Head-1>=0){
                    if(nums[Head-1]==target){
                        Head--;
                    }else{
                        break;
                    }
                }array[0]=Head;
                while(nums[Head+1]==target){
                    Head++;
                }
                array[1]=Head;
                break;
            }else if(nums[Tail]==target){
                while(Tail+1<=numsSize-1){
                    if(nums[Tail+1]==target){
                        Tail++;
                    }else{
                        break;
                    }
                }array[1]=Tail;
                while(nums[Tail-1]==target){
                    Tail--;
                }
                array[0]=Tail;
                break;
            }else{
                Mid=(Head+Tail)/2;
                if(nums[Mid]<=target){
                    Head=Mid;
                    Tail--;
                }else{
                    Tail=Mid;
                    Head++;
                }
            }
        }if(Head>Tail){
            array[0]=-1;
            array[1]=-1;
        }
    }

    return array;
}

执行用时: 12 ms
内存消耗: 7.5 MB

posted on 2021-07-20 22:58  大胖吃不胖  阅读(61)  评论(0)    收藏  举报

导航