1-陣列-11-二分查詢-LeetCode704
參考:程式碼隨想錄
LeetCode:題目序號35
更多內容歡迎關注我(持續更新中,歡迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
技術公眾號:CodeZeng1998(純純技術文)
生活公眾號:好鍋(Life is more than code)
部落格園: CodeZeng1998
其他平臺:CodeZeng1998、好鍋
題目描述:
給定一個 n
個元素有序的(升序)整型陣列 nums
和一個目標值 target
,寫一個函式搜尋 nums
中的 target
,如果目標值存在返回下標,否則返回 -1
。
示例 1:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現在 nums 中並且下標為 4
示例 2:
輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1
提示:
- 你可以假設
nums
中的所有元素是不重複的。 n
將在[1, 10000]
之間。nums
的每個元素都將在[-9999, 9999]
之間。
二分查詢(左閉右閉)
/**
* 二分查詢(左閉右閉)
*
* @param nums 升序排序的陣列
* @param target 目標值
* @return 陣列索引,如果未找到則返回 -1
* @Author: CodeZeng1998
*/
public int binarySearch(int[] nums, int target) {
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
int left = 0;
int right = nums.length - 1;
while (left <= right) {
// 當 left、right為較大整數時可能出現溢位,防止溢位,等同於(left + right)/2
int middle = left + ((right - left) >> 1);
if (nums[middle] > target) {
right = middle - 1;
} else if (nums[middle] < target) {
left = middle + 1;
} else {
return middle;
}
}
return -1;
}
ChatGPT:
這段程式碼實現了一個二分查詢演算法,用於在升序排序的陣列中查詢目標值。以下是程式碼的解釋:
nums
:升序排序的整數陣列。target
:要查詢的目標值。- 方法返回目標值在陣列中的索引,如果未找到則返回 -1。
演算法步驟如下:
- 首先,檢查目標值是否小於陣列的第一個元素或大於陣列的最後一個元素,如果是,則返回 -1,因為目標值不可能存在於陣列中。
- 使用兩個指標
left
和right
分別指向陣列的開頭和結尾。 - 進入迴圈,當
left
小於等於right
時進行查詢。 - 計算中間索引
middle
,採用了防止整數溢位的方式計算,即left + ((right - left) >> 1)
。 - 如果
nums[middle]
大於目標值target
,則更新right
為middle - 1
,因為目標值可能在左半部分。 - 如果
nums[middle]
小於目標值target
,則更新left
為middle + 1
,因為目標值可能在右半部分。 - 如果
nums[middle]
等於目標值target
,則直接返回middle
,表示找到了目標值的索引。 - 如果迴圈結束仍未找到目標值,則返回 -1,表示未找到目標值。
這個演算法的時間複雜度為 O(log n),其中 n 是陣列的長度,因為每次查詢都將搜尋範圍減半。
二分查詢(左閉右開)
/**
* 二分查詢(左閉右開)
*
* @param nums 升序排序的陣列
* @param target 目標值
* @return 陣列索引,如果未找到則返回 -1
* @author CodeZeng1998
*/
public int binarySearch(int[] nums, int target) {
int left = 0;
// 定義target在左閉右開的區間裡,即:[left, right)
int right = nums.length;
// 因為left == right的時候,在[left, right)是無效的空間,所以使用 <
while (left < right) {
// 當 left、right為較大整數時可能出現溢位,防止溢位,等同於(left + right)/2
int middle = left + ((right - left) >> 1);
if (nums[middle] > target) {
right = middle;
} else if (nums[middle] < target) {
left = middle + 1;
} else {
return middle;
}
}
return -1;
}
GhatGPT:
這段程式碼實現了一個二分查詢演算法,與之前的程式碼相比,不同之處在於區間的定義是左閉右開的 [left, right)
,而不是左閉右閉的 [left, right]
。以下是程式碼的解釋:
nums
:升序排序的整數陣列。target
:要查詢的目標值。- 方法返回目標值在陣列中的索引,如果未找到則返回 -1。
演算法步驟如下:
- 定義兩個指標
left
和right
,分別指向陣列的開頭和結尾(但是right
指向的是無效的位置,即陣列最後一個元素的下一個位置)。 - 進入迴圈,當
left
小於right
時進行查詢。 - 計算中間索引
middle
,採用了防止整數溢位的方式計算,即left + ((right - left) >> 1)
。 - 如果
nums[middle]
大於目標值target
,則更新right
為middle
,因為目標值可能在左半部分,但是middle
不包含在搜尋範圍內。 - 如果
nums[middle]
小於目標值target
,則更新left
為middle + 1
,因為目標值可能在右半部分。 - 如果
nums[middle]
等於目標值target
,則直接返回middle
,表示找到了目標值的索引。 - 如果迴圈結束仍未找到目標值,則返回 -1,表示未找到目標值。
這個演算法與之前的演算法相比,在終止條件和區間的定義上有所不同,但是原理和時間複雜度仍然是相同的,都是 O(log n)。
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
.
You must write an algorithm with O(log n)
runtime complexity.
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
Constraints:
1 <= nums.length <= 104
-104 < nums[i], target < 104
- All the integers in
nums
are unique. nums
is sorted in ascending order.
更多內容歡迎關注我(持續更新中,歡迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
技術公眾號:CodeZeng1998(純純技術文)
生活公眾號:好鍋(Life is more than code)
部落格園: CodeZeng1998
其他平臺:CodeZeng1998、好鍋