LeetCode筆記 — LeetCode第35題 — Search Insert Position 解法

Chwang
4 min readJun 24, 2021

--

Github連結

攝影師:stein egil liland,連結:Pexels

1. 題目

說明: 給定一個排序好的數組(array)和一個目標值,當目標值有在數組內會傳回一個索引值,如果沒有在數組內,會回傳一個它如果有在數組內會待在的位置索引

2. 解法

方法一: Linear Search 線性搜尋 — 暴力破解法

說明: 從第一個元素開始一個一個找,只要目標值比元素大就往下,直到元素與目標值一樣就傳回index,或是元素比目標值大時,表示數組中並沒有與目標值一樣的元素,所以也就會返回此元素的索引,如果走到最後都沒有,這個目標值就會插在尾端的索引,也就是最後一個索引+1

時間複雜度: O(n)

def linear_search(nums, target):
for i in range(len(nums)):

## 當i還沒到最後一個元素時
if i < len(nums) - 1:
## 當元素與目標依樣時
if nums[i] == target:
return i
## 當目標值大小介於此元素跟下一個元素中間時
elif nums[i] < target:
if nums[i+1] > target:
return i+1
# 當i比第一個元素小時
elif nums[i] > target:
return i

## 當i走到最後一個元素時
if i == (len(nums) - 1):
if nums[i] >= target:
return i
else:
return i+1

nums = [1, 4, 7, 8, 9]
target = 6
linear_search(nums, target)

執行結果

2

方法二: Binary Search 二元搜尋解法

數組已經排好續的狀況下:

  • 將兩端設定成low = 0, up = len(array) — 1(數組的長度-1就會是最後一個值得索引)
  • 取中間點: middle = (low + up) // 2,比較array[middle]跟目標值的大小
  • 如果array[middle] == 目標值,回傳middle值
  • 如果array[middle] > 目標值,目標就會在low到middle間(不包含middle)
  • 如果array[middle] < 目標值,目標就會middle(不包含middle)到up間
  • 不斷更新low或up值,然後找到新的middel值,直到array[middle] == 目標值,或是兩者交錯,就是找不到值時,就會回傳low那個位置的索引
def binary_search(nums, target):
## 建立上下界的索引
low, up = 0, len(nums) - 1

## 當low沒有與up交叉的時候
while low <= up:
middle = (low + up) // 2
if nums[middle] == target:
return middle
## 當target小於中位數,調整up值,變成middle - 1
elif nums[middle] > target:
up = middle -1
## 當target大於中位數,調整low值,變成middle + 1
elif nums[middle] < target:
low = middle + 1
## 調整直到low與up交叉了
return low

nums = [1, 4, 7, 8, 9]
target = 10
binary_search(nums, target)

執行結果

5

--

--

Chwang
Chwang

Written by Chwang

YO~~ 大家好我是一名AI人工智慧領域的小小工程師, 熱愛自學, 熱愛分享, 下班後的我想為自己Coding, 積極撰寫教學文, 想將自學的程式知識分享給大家, 不斷追求進步的自己, 希望有一天能回饋社會,幫助需要幫助的人, 如果您有什麼很酷的想法,也覺得我還行,歡迎您找我合作~~

No responses yet