1. 程式人生 > 其它 >LeetCode - 搜尋插入位置

LeetCode - 搜尋插入位置

技術標籤:LeetCode

搜尋插入位置

題目描述

給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。
你可以假設陣列中無重複元素。

示例 1:
輸入: [1,3,5,6], 5
輸出: 2

示例 2:
輸入: [1,3,5,6], 2
輸出: 1

示例 3:
輸入: [1,3,5,6], 7
輸出: 4

示例 4:
輸入: [1,3,5,6], 0
輸出: 0

題目分析

  • 陣列是已經排序好的
  • 陣列中無重複數字,但是插入的數字可能會和陣列中的數字重複
  • 若插入數字與陣列中數字重複則返回該索引

解析

暴力破解

  • 遍歷陣列,判斷目標數字與當前位置數字的大小關係,進而進行位置查詢
int searchInsert(int* nums, int numsSize, int target)
{
    for (i = 0; i < numsSize; i++)
    {
        /* 遍歷每個元素,一旦目標小於等於當前元素,說明目標正確的位置即為當前位置 */
        if (target <= nums[i])
            return i;
    }
    return i;   // 大於陣列內的所有元素
}

二分法查詢

  • 因為陣列是有序的,因此可以直接獲取當前陣列中間位置對應的數值,判斷與目標數字的大小關係
    在這裡插入圖片描述
  • 如果目標值小於中間值,則更新right位置
    在這裡插入圖片描述
  • 如果目標值大於中間值,則更新right位置
    在這裡插入圖片描述
  • 如果相等則返回mid值

程式碼實現

int searchInsert(int* nums, int numsSize, int target)
{
    int left = 0;
    int right = numsSize;
    int mid = 0;
    while(left < right) // 二分查詢的退出條件
    {
        mid = left + (right - left) / 2;    //計算中間值位置
        if (target <= nums[mid])            //判目標與中間值大小關係
right = mid; else left = mid + 1; } return left; }