此为历史版本和 IPFS 入口查阅区,回到作品页
為自己Coding
IPFS 指纹 这是什么

作品指纹

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

為自己Coding
·
·


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
CC BY-NC-ND 2.0 授权