[英]time complexity of this algorithm written below
根據我的計算,這個算法/代碼的時間復雜度是O(logN),因為它是對二分查找的增強,但是在leetcode和其他平台提交代碼時,據說超過了時間限制。 他們還期望該算法的時間復雜度為 O(logN),所以請確認下面編寫的代碼的復雜度是 O(logN) 還是與此不同?
class Solution {
public:
int findLast(vector<int> arr, int n, int x)
{
int l = 0;
int h = n - 1;
int mid;
while (h >= l) {
mid = (l + h) / 2;
if (arr[mid] == x) {
if (arr[mid + 1] != x) {
return mid;
}
else {
l = mid + 1;
}
}
else if (arr[mid] > x) {
h = mid;
}
else if (arr[mid] < x) {
l = mid + 1;
}
}
return -1;
}
int findFirst(vector<int> arr, int n, int x)
{
int l = 0;
int h = n - 1;
int mid;
while (h >= l) {
mid = (l + h) / 2;
if (arr[mid] == x) {
if (arr[mid - 1] != x) {
return mid;
}
else {
h = mid;
}
}
else if (arr[mid] > x) {
h = mid;
}
else if (arr[mid] < x) {
l = mid + 1;
}
}
return -1;
}
vector<int> searchRange(vector<int>& nums, int target)
{
int last = findLast(nums, nums.size(), target);
int first = findFirst(nums, nums.size(), target);
vector<int> v1 = { first, last };
return v1;
}
};
您的代碼的時間復雜度為 O(∞),因為它可以執行無限循環。
考慮一下在單元素向量上運行findLast
時會發生什么。 你將得到h
、 l
和mid
等於 0。如果你進入arr[mid] > x
分支,那么你運行h = mid;
它使變量保持不變,並無限期地重復。
除此之外,您應該通過引用獲取vector
參數以避免復制,這會使它成為線性運行時。
您的代碼無法處理輸入可能為[1,1]
且目標為1
的某些極端情況。 在findLast
中, low
變量和high
變量將變為1
,當您檢查arr[mid+1]
時會發生分段錯誤。 對於findFirst
,同樣的解釋也是 go。 試試這個,看看它是否有幫助:
int findLast(vector<int> arr, int n, int x)
{
int l = 0;
int h = n - 1;
int mid;
while (h > l)
{
mid = (l + h) / 2;
if (arr[mid] == x)
{
if (arr[mid + 1] != x)
{
return mid;
}
else
{
l = mid + 1;
}
}
else if (arr[mid] > x)
{
h = mid;
}
else if (arr[mid] < x)
{
l = mid + 1;
}
}
return arr[l] == x ? l : -1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.