정렬 된 배열 + 2 점 에서 요소 의 첫 번 째 및 마지막 위 치 를 찾 습 니 다.
시간 복잡 도 요구: O (logn)
분석: 시간 을 맞 추고 찾 아야 합 니 다. 우 리 는 2 분 동안 찾 을 생각 을 하기 어렵 지 않 습 니 다.그런데 한 가 지 는 첫 번 째 와 마지막 을 어떻게 알 아 냈 을 까?이것 은 나 를 괴 롭 혔 다.
알고리즘: leetcode caikehe 에서 왔 습 니 다.
1. 이분 변 체 를 사용 하여 target 을 index 1 로 찾 고 target + 1 을 index 2 로 찾 습 니 다.
2. index 를 판단 합 니 다. 경 계 를 넘 지 않 고 대응 값 이 target 과 같 으 면 {index 1, index 2 - 1} 을 되 돌려 줍 니 다.그렇지 않 으 면 {- 1, - 1} 로 돌아 갑 니 다.
소스 코드
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
//binary find
int index1 = binarySearch(nums, target);
int index2 = binarySearch(nums, target+1) - 1;
if(index1 < nums.size() && nums[index1] == target)
return {index1, index2};
return {-1, -1};
}
//
int binarySearch(vector<int>& nums, int target)
{
int l = 0, r = nums.size()-1;
while(l <= r)
{
int mid = l + (r-l)/2;
if(nums[mid] < target)
l = mid + 1;
else
r = mid -1;
}
return l;
}
};
이해 하기 쉬 운 알고리즘
1 class Solution {
2 public:
3 vector<int> searchRange(vector<int>& nums, int target) {
4 int len = nums.size();
5 if(len <= 0)
6 return {-1, -1};
7 if(len == 1)
8 if(nums[0] == target)
9 return {0, 0};
10 else
11 return {-1, -1};
12
13
14 int l = 0, r = len-1, mid;
15 while(l <= r)
16 {
17 mid = l + (r-l)/2;
18 if(nums[mid] == target)
19 break;
20 else if(nums[mid] > target)
21 r = mid - 1;
22 else
23 l = mid + 1;
24 }
25 if(nums[mid] != target)
26 return {-1, -1};
27
28 l = mid, r = mid;
29 while(l >= 0 && nums[l] == nums[mid])
30 l--;
31 while(r < len && nums[r] == nums[mid])
32 r++;
33 return {l+1, r-1};
34 }
35 };
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.