Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.
給予一個有升冪排序(小到大)的整數陣列 nums 與一個整數目標。 編寫一個函式在 nums 中尋找 target。 如果目標存在則返回陣列位置,否則返回 -1。
Example 1:
Input: nums = [-1,0,3,5,9,12], target = 9 Output: 4 Explanation: 9 exists in nums and its index is 4
Example 2:
Input: nums = [-1,0,3,5,9,12], target = 2 Output: -1 Explanation: 2 does not exist in nums so return -1
Solution:
1. 設定 left 為 0, right 為 nums 的長度 – 1。
2. while 迴圈處理當 left <= right 時,持續更新搜尋範圍。
left: v –> nums: [口,口,口,口,口] right: <--v
Code.1:
var search = function(nums, target) { let left = 0, right = nums.length - 1 while (left <= right) { let middle = Math.floor((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 } } return -1 } Code.2:var search = function(nums, target) { return nums.indexOf(target) };FlowChart:
Example 1Input: nums = [-1,0,3,5,9,12], target = 9 let left = 0, right = nums.length - 1 //5 step.1 while(left <= right) middle = Math.floor((left + right) / 2) => (0 + 5) / 2 = 2(2.5) nums[2] < target //3 < 9 left = middle + 1 //2 + 1 = 3 step.2 while(left <= right) middle = Math.floor((left + right) / 2) => (3 + 5) / 2 = 4 nums[4] === target //9 = 9 return middle // 4Example 2
Input: nums = [-1,0,3,5,9,12], target = 2 let left = 0, right = nums.length - 1 //5 step.1 while(left <= right) middle = Math.floor((left + right) / 2) => (0 + 5) / 2 = 2(2.5) nums[2] < target //3 > 2 right = middle - 1 //5 -1 = 4 step.2 while(left <= right) middle = Math.floor((left + right) / 2) => (0 + 4) / 2 = 2 nums[4] > target //3 > 2 right = middle - 1 //4 - 1 = 3 step.3 while(left <= right) middle = Math.floor((left + right) / 2) => (0 + 3) / 2 = 1(1.5) nums[1] < target //0 < 2 left = middle + 1 //1 + 1 = 2 step.4 while(left <= right) middle = Math.floor((left + right) / 2) => (2 + 3) / 2 = 2(2.5) nums[2] > target //3 > 2 right = middle - 1 //2 - 1 = 1 step.5 while(left > right) //2 > 1 return -1IndexOf()
indexOf():回傳第一個指定元素在陣列中的位置,若不存在則返回-1。 const beasts = ['ant', 'bison', 'camel', 'duck', 'bison']; console.log(beasts.indexOf('bison')); // expected output: 1 // start from index 2 console.log(beasts.indexOf('bison', 2)); // expected output: 4 console.log(beasts.indexOf('giraffe')); // expected output: -1Math.floor()
Math.floor():回傳小於等於該數字的最大整數。 console.log(Math.floor(5.95)); // expected output: 5 console.log(Math.floor(5.05)); // expected output: 5ex.此題與「LeetCode Js-35. Search Insert Position」類似觀念。