leetcode 704 :Binary Search
題目鏈接: https://leetcode-cn.com/problems/binary-search/
難度: 簡單
歸類 : 數組操作 二分查找
題目
給定一個?n?個元素有序的(升序)整型數組?nums 和一個目標值?target ?,寫一個函數搜索?nums?中的 target,如果目標值存在返回下標,否則返回 -1。
你可以假設 nums 中的所有元素是不重複的。
n 將在 [1, 10000]之間。
nums 的每個元素都將在 [-9999, 9999]之間
示例:
示例 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
解法
主要使用c++和python等兩種語言進行了解答,以及經典題解和嘗試改進的最優/最簡潔解法。
本題目是標準的二分法題目
個人解法
C++解法
//c++解法
//二分法
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
int start = 0, end = len, mid;
while(start < end){
mid = start + (end - start) / 2;
if(nums[mid] == target) return mid;
else if(nums[mid] > target) end = mid;
else start = mid + 1;
}
return -1;
}
};
時間複雜度: O(NlogN)
空間複雜度: O(1)
提交結果:
執行用時 :88 ms, 在所有 C++ 提交中擊敗了37.56%的用戶
內存消耗 :25.6 MB, 在所有 C++ 提交中擊敗了5.88%的用戶
//另外一種邊界條件的二分法
class Solution {
public:
int search(vector<int>& nums, int target) {
int l=0,r=nums.size()-1;
while(l<=r)
{
int m=(r-l)/2+l;
if(nums[m]>target)
{
r=m-1;
}
else if(nums[m]<target)
{
l=m+1;
}
else
return m;
}
return -1;
}
};
時間複雜度: O(NlogN)
空間複雜度: O(1)
提交結果:
執行用時 :88 ms, 在所有 C++ 提交中擊敗了37.56%的用戶
內存消耗 :25.6 MB, 在所有 C++ 提交中擊敗了5.88%的用戶
python解法
#python解法
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
length = len(nums)
start = 0
end = length
while start < end:
mid = start + (end - start) / 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
end = mid
else:
start = mid + 1
return -1
時間複雜度: O(NlogN)
空間複雜度: O(1)
提交結果:
執行用時 :248 ms, 在所有 Python 提交中擊敗了78.71%的用戶
內存消耗 :13.7 MB, 在所有 Python 提交中擊敗了14.29%的用戶
題解優解
此題解法:
二分法(O(NlogN), O(1))