背景需求:給定一個有序數組(不是有序數組不能用二分查找法)以及一個值,如果查找成功返回目標的索引值;否則返回-1。當待搜索的集合是相對靜態的數據集時,此時使用二分查找是最好的選擇。
主要考慮的點:邊界值的處理
思路:開始時,先找出有序集合中間的那個元素。如果此元素比要查找的元素大,就接着在較小的一個半區進行查找;反之,如果此元素比要找的元素小,就在較大的一個半區進行查找。在每個更小的數據集中重複這個查找過程,直到找到要查找的元素或者數據集不能再分割。
圖解:
left、right 表示索引
function binarySearch (arr, target) {
let left = 0 // 初始化,左邊界是數組第一個索引
let right = arr.length - 1 // 初始化右邊界是數組最後一個索引
while(left <= right) {
let middleNum = parseInt((left + right) / 2, 10) // 中間索引
if (target < arr[middleNum]) {
right = middleNum - 1 // 說明target 在左側 重新賦值右索引
} else if (target > arr[middleNum]) {
left = middleNum + 1 // 說明target 在右側 重新賦值左索引
} else {
return middleNum
}
}
return -1 // 沒找到 返回-1
}
例題:
給定一個數組 nums
,編寫一個函數將所有 0
移動到數組的末尾,同時保持非零元素的相對順序。
雙指針問題:
<script>
let arr = [1, 0, 3, 5, 0, 6, 0, 7]
var moveZeroes = function(nums) {
var key = 0 // 指針
var index = 0 // 索引
while(index < nums.length) {
if (nums[index] !== 0) {
// 重新賦值
nums[key] = nums[index]
++index
++key
} else {
++index
}
}
// 其餘填充0
for(var i = key; i < index; i++) {
nums[i] = 0
}
return nums
};
console.log(moveZeroes(arr))
</script>
雙指針交換位置:
let arr = [1, 0, 3, 5, 0, 6, 0, 7]
var moveZeroes = function(nums) {
var key = 0 // 指針
var index = 0 // 索引
while(index < nums.length) {
if (nums[index] !== 0) {
// 交換位置
temp = nums[index]
nums[index] = nums[key]
nums[key] = temp
++index
++key
} else {
++index
}
}
return nums
};
console.log(moveZeroes(arr))