정렬 그룹에서 숫자 찾기 - 2분법
면접문제 53-1: 한 숫자가 정렬수 그룹에 나타난 횟수를 통계한다.
이분법 찾기
해법 1:이분법의 변형
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.empty())
return 0;
int low = 0, high = data.size() - 1;
int FirstK = BinarySearchFirstK(data, low, high, k);
int FinalK = BinarySearchFinalK(data, low, high, k);
int TimeOfK = 0;
if(FirstK > -1 && FinalK > -1) //
TimeOfK = FinalK - FirstK + 1;
return TimeOfK;
}
// K ,
int BinarySearchFirstK(vector<int>& data,int low,int high,int k){
if(low <= high){
int mid = (high + low) >> 1;
if(data[mid] == k){
if(mid == 0 || data[mid - 1] != k)
return mid;
else
return BinarySearchFirstK(data, low, mid - 1, k);
//return (mid == 0 || data[mid - 1] != k) ? mid : BinarySearchFirstK(data, low, mid - 1, k);
}
if(data[mid] > k)
return BinarySearchFirstK(data, low, mid - 1, k);
if(data[mid] < k)
return BinarySearchFirstK(data, mid + 1,high, k);
}
return -1;
}
// K ,
int BinarySearchFinalK(vector<int>& data,int low,int high,int k){
if(low <= high){
int mid = (high + low) >> 1;
if(data[mid] == k)
return (data.size()-1 == mid || data[mid + 1] != k) ? mid : BinarySearchFinalK(data, mid + 1, high, k);
if(data[mid] > k)
return BinarySearchFinalK(data, low, mid - 1, k);
if(data[mid] < k)
return BinarySearchFinalK(data, mid + 1,high, k);
}
return -1;
}
};
//
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.empty())
return 0;
int low = 0, high = data.size() - 1;
int FirstK = BinarySearchFirstK(data, low, high, k);
int FinalK = BinarySearchFinalK(data, low, high, k);
int TimeOfK = 0;
if(FirstK > -1 && FinalK > -1) //
TimeOfK = FinalK - FirstK + 1;
return TimeOfK;
}
// K ,
int BinarySearchFirstK(vector<int>& data,int low, int high, int k){
while(low <= high){
int mid = (high + low) >> 1;
if(data[mid] == k){
if(mid == 0 || data[mid - 1] != k)
return mid;
else
high = mid - 1;
}
if(data[mid] > k)
high = mid - 1;
if(data[mid] < k)
low = mid + 1;
}
return -1;
}
// K ,
int BinarySearchFinalK(vector<int>& data,int low,int high,int k){
while(low <= high){
int mid = (high + low) >> 1;
if(data[mid] == k)
if(data.size()-1 == mid || data[mid + 1] != k)
return mid;
else
low = mid + 1;
if(data[mid] > k)
high = mid - 1;
if(data[mid] < k)
low = mid + 1;
}
return -1;
}
};
해법 2: STL 2점 찾기 알고리즘
#if 1
//STL:equal_range() 。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
auto resultPair = equal_range(data.begin(), data.end(),k);
return resultPair.second - resultPair.first;
}
};
#elif 0
//STL:
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
return upper_bound(data.begin(), data.end(), k) - lower_bound(data.begin(), data.end(), k);
}
};
#endif
면접 문제 53 - II.0~n-1에서 빠진 숫자
길이가 n-1인 점증 정렬수 그룹의 모든 숫자는 유일하며, 모든 숫자는 범위 0~n-1 안에 있다.범위 0~n-1 내의 n개의 숫자 중 하나만 이 수조에 있지 않으니 이 숫자를 찾으십시오.
class Solution {
public:
int missingNumber(vector<int>& nums) {
//if(nums.empty()) return -1; //
int low = 0, high = nums.size()-1;
while(low <= high){
int mid = (low + high) >> 1;
if(nums[mid] == mid) //
low = mid + 1;
if(nums[mid] != mid){ //
if(mid == 0 || nums[mid - 1 ] == mid - 1)
return mid; //
if(nums[mid - 1 ] != mid - 1)
high = mid - 1;
}
}
// , ,
if(low == nums.size())
return nums.size();
// , ,
// 0 n-1 ( )
return -1;
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.