演算法題 有序陣列查詢目標的範圍,返回下標

2022-10-09 01:27:10 字數 725 閱讀 9472

給定乙個有序陣列,在陣列中找到目標值的起始和終止下標,不存在返回 [-1,-1]。

要求時間複雜度為 o(lg(n))。

例子: arr: [1,3,4,5,6,6,6,7] , target: 6;return: [4,6]

陣列有序查詢,時間複雜度為 lg n,根據這兩句話,很容易想到二分法。但在查詢到乙個元素後,不可向前向後遍歷獲取起始和終止下標,當陣列中大部分元素相同且正好為target時,時間複雜度變為線性級別。

可以多次使用二分法查詢,確定邊界。

public class search ;

int target = 6;

system.out.println(arrays.tostring(search(arr, target)));

}public static int search(int arr, int target) ;

while (lt < arr.length) else

}int gt = arr.length - 1;

while (gt > 0) else

}return res;

}public static int binarysearch(int arr, int lo, int hi, int target) else if (target < arr[mid]) else

}return -1;

}}

演算法 有序陣列求目標和

在有序陣列中找出兩個數,使它們的和為 target.例如 array target 為 6 則 返回和為 6 的 array下標 使用雙指標,乙個指標指向值較小的元素,乙個指標指向值較大的元素。指向較小元素的指標從頭向尾遍歷,指向較大元素的指標從尾向頭遍歷。param nums the sorted...

演算法題 有序陣列去重

將有序陣列去重並且列印去重之後的長度。快慢指標思想,邏輯上的指標,並非 這個指標 定義兩個指標slow,fast。fast逐個遍歷元素,如果與slow不同,則把slow所指元素列印出來,如果與slow所指元素相同,則fast 1,直至遍歷結束。include using namespace std ...

演算法題 兩有序陣列中位數

有兩個排序的陣列,長度都為n,求合併後的排序陣列的中位數。要求時間複雜度為log n 解法1 直接的解法是遍歷兩個陣列並計數,類似歸併排序裡面的有序陣列的合併,複雜度為o n 解法2 分治策略 設兩個陣列為a n b n 若a n 2 b n 2 中位數k必定位於a n 2 a n b 0 b n ...