[東哥的leetcode刷題日記] leetcode 704 :Binary Search

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))


嘗試改進的最優解法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章