Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You must write an algorithm with O(log n) runtime complexity.
給定一個有序陣列,陣列中有多個不重複的整數 以及 一個目標值,請回傳目標值在陣列中的索引值。如果陣列中沒有跟目標值相同的整數,則回傳目標值在陣列中插入的位置。
你必須編寫一個算法,其時間複雜度是 O(log n)。
其實這一題在很久之前就寫過了(而且還寫了兩次),今天就把之前的兩種做法整理一下做個記錄囉!
Binary Search(二分法搜尋)
第一種作法是按照Binary Search(二分法搜尋)的概念解題的,解題思路如下:
瞄一眼程式碼
var searchInsert = function(nums, target) {
if (target < nums[0]) return 0
let start = 0
let end = nums.length
while (start < end) {
const mid = Math.floor((start + end) / 2)
if (target > nums[mid]) {
start = mid + 1
} else {
end = mid
}
}
return start
};
直覺解法
下面這一版是第一次解題的記錄,當時沒有使用Binary Search(二分法搜尋)所以時間複雜度較高。
(自評: 這個做法明顯比Binary Search(二分法搜尋)效率低)
程式碼
var searchInsert = function(nums, target) {
// for loop 檢查nums
let res = 0
for (let i = 0; i < nums.length; i++) {
//比較大就往下檢查
if (nums[i] < target) {
res++
//一樣大回傳當前index值
} else if (nums[i] === target) {
res = i
}
}
return res
};