1.1 兩種實現
// 情況一:right = nums.length
int binary_search(int nums, int target) else if (nums[mid] < target) else if (nums[mid] > target)
}// 因為迴圈的結束條件是 left = right,它們指向的元素未被判斷,所以還要再判斷這個遺漏的元素
return nums[left] == target ? left : -1;
}
// 情況二:right = nums.length - 1
int binary_search(int nums, int target) else if (nums[mid] > target) else if (nums[mid] < target)
}// 不存在遺漏的情況
return -1;
}
遺漏: 指第一次 mid 定位的那個元素剛好就是 target 元素所求邊界的特殊情況
2.1 兩種實現
// 情況一:right = nums.length
public int searchleft(int nums, int target) else if (nums[mid] < target) else
}// 1. 越界。target 比所有的值都要大
// 2. 沒有越界。因為迴圈的結束條件是 left = right,這個遺漏的元素就是 left 指向的元素
if (left == nums.length || nums[left] != target)
return left;
}
// 情況二:right = nums.length - 1
public int searchleft(int nums, int target) else if (nums[mid] < target) else
}// 1. 越界。target 比所有的值都要大
// 2. 沒有越界。因為迴圈的結束條件是 left = right + 1,這個遺漏的元素就是 left 指向的元素
if (left == nums.length || nums[left] != target)
return left;
}
3.1 兩種實現
// 情況一:right = nums.length
public int searchright(int nums, int target) else if (nums[mid] < target) else
}// 處理越界情況和遺漏判斷
if (right == 0 || nums[right - 1] != target)
return right - 1;
}
// 情況二:right = nums.length - 1
public int searchright(int nums, int target) else if (nums[mid] < target) else
}// 處理越界情況和遺漏情況
if (right < 0 || nums[right] != target)
return right;
}
參考:二分查詢詳解 二分查詢細節永不忘
二分查詢中大於小於,甚至判斷條件中的 很容易弄混。下面一起來捋清楚,保證了解原理,不會再錯。重點的概念在於選區的區間 我建議選取的區間為左閉右閉,即 l,r 當然其他方式也可以,我們不做講述。因此需要注意以下三點即可 1.r arr.length 1而不是length 這樣使得r為末數的下標,有意義...
查詢問題 二分查詢
首先,查詢的方式有很多種方法,比如 二分查詢,順序查詢,斐波那契查詢,插值查詢,但是基本都是基於二分查詢的思想。接下來說一下二分的基本實現方法。二分查詢的思想其實很簡單,就是不斷地將你所要查詢的數字和你所查詢的陣列中的最中間的數字比較,如果比陣列中的中間的數字大,則將該陣列中的前面的所有的數字全部忽...
二分查詢問題
常見的二分查詢問題 1 給定排序陣列求乙個給定數在陣列中的下標,如果不存在就返回應該插入的位置 int searchinsert int a,int n,int target else return start 2 給定乙個 排序陣列,然後經過旋轉後,查詢給定值是否在陣列中。思路 1 先看左邊有序還...