LeetCode#35-Search Insert Position-搜索插入位置

一、題目

給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。如果目標值不存在於數組中,返回它將會被按順序插入的位置。

你可以假設數組中無重複元素。

示例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

二、題解

  • 解法1:暴力求解

一開始想的是遍歷數組,比較當前元素和目標值,如果相等,就返回當前元素的下標。

可如果數組裏沒有與目標值相同的元素呢?難不成從頭遍歷,去找比目標值小的元素麼?

因此設置一個 pos,遍歷數組時,判斷當前元素是否小於目標值,如果小於目標值,就將 pos 加 1,如果找到和目標值相同的元素,就返回該元素的下標。如果遍歷到尾沒有找到該元素,就返回這個 pos即爲要插入的位置。

時間複雜度:O(n),空間複雜度:O(1)。

function searchInsert($nums, $target) {
    $pos = 0;
    foreach ($nums as $k => $v) {
        if ($v < $target) {
            $pos++;
        }
        if ($v == $target) {
            return $k;
        } 
    }
    return $pos;
}
  • 解法2:二分查找

題目已經給出了關鍵詞——排序數組。那無疑就是用“二分查找”了。二分查找的原理及實現可以參見數據結構與算法之PHP查找算法(二分查找)

整體思路和普通的二分查找幾乎沒有區別,先設定起點下標 start 和終點下標 end,再計算中間下標 mid,每次根據 nums[mid]target 之間的大小進行判斷,相等則直接返回下標。

但根據題意,如果目標值不存在於數組中,返回它將會被按順序插入的位置。因此查找結束如果沒有相等值則返回 start,該值爲插入位置。

時間複雜度:log(n),空間複雜度:O(1)。

function searchInsert2($nums, $target) {
    $start = 0;
    $end = count($nums) - 1;
    while ($start <= $end) {
        $mid = floor(($start + $end) / 2);
        if ($target == $nums[$mid]) {
            return $mid;
        } elseif ($target < $nums[$mid]) {
            $end = $mid - 1;
        } else {
            $start = $mid + 1;
        }
    }
    return $start; //要插入的位置
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章