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.
提供一個由小到大的整數陣列和一個目標值,如果目標值存在陣列中,則回傳位置,反之回傳依排序下應放入之位置。
Example 1:
Input: nums = [1,3,5,6], target = 5 Output: 2
Example 2:
Input: nums = [1,3,5,6], target = 2 Output: 1
Example 3:
Input: nums = [1,3,5,6], target = 7 Output: 4
Solution:
1. 先確認目標值是否存在陣列中,如「是」則回傳位置。
2. 如「不是」則依序確認陣列中第一個比目標值大的數值,
回傳它的位置。
3. 如目標值不存在陣列,則放入陣列最後一個位置。
Code 1:
var searchInsert = function(nums, target) { //運用indexOf指令比對並回傳位置 const targetIndex = nums.indexOf(target) if (targetIndex >= 0) return targetIndex //若不存在於陣列中,則indexOf()會回傳 -1。 //使用for依序比對目標與陣列值得大小 for (let i = 0; i < nums.length; i++) { if (nums[i] > target) { return i } } //陣列沒有比目標值大,放到最後一個位置 return nums.length };
FlowChart:
Example 1
step.1 targetIndex = nums.indexOf(target) //找到符合回傳位置 Array = 0 1 2 3 nums = [1, 3, 5, 6] target = 5 return targetIndex //targetIndex = 2
Example 2
step.1 targetIndex = nums.indexOf(target) //targetIndex = -1 ,不存在陣列 step.2 Array = 0 1 2 3 nums = [1, 3, 5, 6] target = 2 Array[i] > target,return i //3 > 2,return 1
Example 3
step.1 targetIndex = nums.indexOf(target) //targetIndex = -1 ,不存在陣列 step.2 Array = 0 1 2 3 nums = [1, 3, 5, 6] target = 7 Array[i] < target,return i //陣列中沒有大於目標值的數 return nums.length //nums.length = 4,陣列的長度等於接下來陣列需新增的位置
Remark.1: 暴力解 => 運用push()來將目標放入陣列中,在用sort()對陣列的數值進行排序,但要注意預設排序是根據Unicode的編碼位置。
Code 2:
var searchInsert = function(nums, target) { nums.push(target) nums.sort((a,b) => a - b) return nums.indexOf(target) };
Code 3: Binary Search
var searchInsert = function(nums, target) { //宣告nums的左右位置 let left = 0 let right = nums.length - 1 while (left <= right) { //宣告中間的位置為整數 const middle = Math.floor(left + (right - left) / 2) //((left + right) / 2) //如果目標值位在陣列中間,回傳中間位置 if (nums[middle] === target) { return middle //如果目標值比陣列中間值大,把右邊位置往左一格 } else if (nums[middle] > target) { right = middle - 1 //如果目標值比陣列中間值小,把左邊位置往右一格 } else if (nums[middle] < target) { left = middle + 1 } } //如果目標值不在陣列內,新增在陣列最後一個位置(nums.length) return right + 1 };
Code 4: for loop desc
var searchInsert = function(nums, target) { for (let i = nums.length - 1; i >= 0; i--) { if (target > nums[i]) return i + 1 if (target === nums[i]) return i } return 0 };
left + (right - left) / 2 = (right + left / 2)
(l+r)/2 = l/2 + r/2 = l/2 + r/2 + 0 = l/2 + r/2 + (l/2 - l/2) = (l/2 + l/2) + (r/2 - l/2) = l + (r-l)/2
source:https://cs.stackexchange.com/questions/80415/why-is-binary-search-using-this-weird-thing-to-calculate-middle