學渣帶你刷Leetcode0034在排序數組中查找元素的第一個和最後一個位置

題目描述

給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。

你的算法時間複雜度必須是 O(log n) 級別。

如果數組中不存在目標值,返回 [-1, -1]。

示例 1:

輸入: nums = [5,7,7,8,8,10], target = 8
輸出: [3,4]
示例 2:

輸入: nums = [5,7,7,8,8,10], target = 6
輸出: [-1,-1]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

白話題目:

找到目標值在有序的數組中的開始和結束位置,要快一些。

算法:

(1)二分法找符合的值

(2)二分法看在不在

(3)//二分法查找第一個 小於等於target的數

//二分法精髓:Mid=(low+high)/2 則每次 Mid 取值偏向 iLeft,high=mid,返回low

(4)//二分法查找第一個大於等於 target 的數

//二分法精髓:Mid=(Low+hight+1)/2 則每次 Mid 取值偏向 iRight,low=mid,返回high

詳細解釋關注 B站  【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB

C語言完全代碼

#include <stdio.h>
#include <stdlib.h>
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

//二分法查找 target 值
int binarySearch(int* nums, int numsSize, int target){
    int     low       = 0;
    int     mid        = 0;
    int     high      = 0;
    int    flag        = 0;

    low = 0;
    high = numsSize - 1;

    while(low <= high)
    {
        mid = (low + high) / 2;
        if (nums[mid] == target)
        {
            flag = 1;
            break;
        }

        if (nums[mid] < target)
        {
            low = mid + 1;
        }
        else
        {
            high = mid - 1;
        }
    }
    return flag;
}

//二分法查找第一個 小於等於target的數
int binarySearchLess(int* nums, int numsSize, int target){
    int     low       = 0;
    int     mid        = 0;
    int     high      = 0;

    low = 0;
    high = numsSize - 1;

    while(low < high)
    {
        mid = (low + high) / 2;        //二分法精髓:Mid=(Left+Right)/2 則每次 iMid 取值偏向 iLeft

        if (nums[mid] < target)
        {
            low = mid + 1;

        }
        else   //取偏左的,
        {
             high = mid;
        }

    }
    return low;
}

//二分法查找第一個大於等於 target 的數
int binarySearchGreater(int* nums, int numsSize, int target){
    int     low       = 0;
    int     mid        = 0;
    int     high      = 0;

    low = 0;
    high = numsSize - 1;

    while(low < high)
    {
        mid = (low + high + 1) / 2;        //二分法精髓:iMid=(iLeft+iRight+1)/2 則每次 iMid 取值偏向 iRight

        if (nums[mid] <= target)
        {
            low = mid;
        }
        else
        {
            high= mid - 1;
        }

    }
    return high;
}

//1,使用二分法判斷是否存在目標值
//2,使用二分法找到第一個 小於等於 target 的位置
//3,使用二分法找到第一個 大於等於 target 的位置
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    int*    ret  = (int *)malloc(sizeof(int) * 2);
    ret[0] = -1;
    ret[1] = -1;
    *returnSize = 2;

    //1,使用二分法判斷是否存在目標值
    if (binarySearch(nums, numsSize, target))
    {
        //2,使用二分法找到第一個 小於等於 target 的位置
        ret[0] = binarySearchLess(nums, numsSize, target);

        //3,使用二分法找到第一個 大於等於 target 的位置
        ret[1] = binarySearchGreater(nums, numsSize, target);
    }
    return ret;
}

int main()
{
    int numsSize;
    scanf("%d",&numsSize);

    int nums[numsSize];
    int i;
    for(i=0;i<numsSize;i++)
    {
        scanf("%d",&nums[i]);
    }

    int target;
    scanf("%d",&target);

    int returnSize;
    int  *result=searchRange(nums, numsSize, target, &returnSize);
    for(i=0;i<returnSize;i++)
    {
        printf("%d ",result[i]);
    }

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章