- Total Occurrence of Target
中文English
Given a target number and an integer array sorted in ascending order. Find the total number of occurrences of target in the array.
Example
Example1:
Input: [1, 3, 3, 4, 5] and target = 3,
Output: 2.
Example2:
Input: [2, 2, 3, 4, 6] and target = 4,
Output: 1.
Example3:
Input: [1, 2, 3, 4, 5] and target = 6,
Output: 0.
Challenge
Time complexity in O(logn)
解法1:
Binary Search 找到target第一次出现和最后一次出现的位置,相减+1即可。
代码如下:
class Solution {
public:
/**
* @param A: A an integer array sorted in ascending order
* @param target: An integer
* @return: An integer
*/
int totalOccurrence(vector<int> &A, int target) {
int n = A.size();
if (n == 0) return 0;
int firstPos = findFirstPos(A, target);
if (firstPos == -1) return 0;
int lastPos = findLastPos(A, target);
if (lastPos == -1) return 0;
return lastPos - firstPos + 1;
}
int findFirstPos(vector<int> &A, int target) {
int n = A.size();
if (n == 0) return -1;
int start = 0, end = n - 1;
while(start + 1 < end) {
int mid = start + (end - start) / 2;
if (A[mid] >= target) {
end = mid;
} else if (A[mid] < target) {
start = mid;
}
}
if (A[start] == target) return start;
if (A[end] == target) return end;
return -1;
}
int findLastPos(vector<int> &A, int target) {
int n = A.size();
if (n == 0) return -1;
int start = 0, end = n - 1;
while(start + 1 < end) {
int mid = start + (end - start) / 2;
if (A[mid] > target) {
end = mid;
} else if (A[mid] <= target) {
start = mid;
}
}
if (A[end] == target) return end;
if (A[start] == target) return start;
return -1;
}
};