medium!
題目描述:
給定乙個按照公升序排列的整數陣列nums
,和乙個目標值target
。找出給定目標值在陣列中的開始位置和結束位置。
你的演算法時間複雜度必須是 o(log n) 級別。
如果陣列中不存在目標值,返回[-1, -1]
。
示例 1:
輸入: nums = [示例 2:5,7,7,8,8,10]
, target = 8輸出: [3,4]
輸入: nums = [解題思路:5,7,7,8,8,10]
, target = 6輸出: [-1,-1]
這道題讓我們在乙個有序整數陣列中尋找相同目標值的起始和結束位置,而且限定了時間複雜度為o(logn),這是典型的二分查詢法的時間複雜度,所以這道題也需要用此方法,我們的思路是首先對原陣列使用二分查詢法,找出其中乙個目標值的位置,然後向兩邊搜尋找出起始和結束的位置,**如下:
c++解法一:
1class
solution ;
6int left = idx, right =idx;
7while (left > 0 && nums[left - 1] == nums[idx]) --left;
8while (right < nums.size() - 1 && nums[right + 1] == nums[idx]) ++right;
9return;10
}11int search(vector& nums, int left, int right, int
target)
18 };
可能有些人會覺得上面的演算法不是嚴格意義上的o(logn)的演算法,因為在最壞的情況下會變成o(n),比如當陣列裡的數全是目標值的話,從中間向兩邊找邊界就會一直遍歷完整個陣列,那麼我們下面來看一種真正意義上的o(logn)的演算法,使用兩次二分查詢法,第一次找到左邊界,第二次呼叫找到右邊界即可。
c++解法二:
1class
solution
11if (nums[right] != target) return
res;
12 res[0] =right;
13 right =nums.size();
14while (left 19 res[1] = left - 1;20
return
res;21}
22 };
LeetCode34搜尋範圍
給定乙個已經公升序排序的整形陣列,找出給定目標值的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。如果在陣列中找不到目標,返回 1,1 例如 給出 5,7,7,8,8,10 和目標值 8,返回 3,4 自己寫的第一種方法就是普通二分查詢,找到target數字之後,分別向前向後遍...
34 搜尋範圍
給定乙個按照公升序排列的整數陣列nums,和乙個目標值target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。如果陣列中不存在目標值,返回 1,1 示例 1 輸入 nums 5,7,7,8,8,10 target 8 輸出 3,4 示例 2 輸入 ...
leetcode 34 區間查詢
一 題目 分析 首先,要求了時間複雜度o log n 說明暴力禁止 我們可以通過二分查詢法確定左右區間邊界 但是不能同時找出左右邊界,我們可以先確定左邊界,再確定右邊界 class solution public int findleft int nums,int target,int begin,...