class Solution {
public int countTarget(int[] scores, int target) {
// 初始化左右边界,分别用于查找第一个和最后一个目标值的位置
int left = binarySearch(scores, target, true); // 查找第一个目标值的位置
int right = binarySearch(scores, target, false); // 查找最后一个目标值的位置
// 如果没有找到目标值,则返回 0
if (left == -1 || right == -1) return 0;
// 返回目标值的数量
return right - left + 1;
}
// 二分查找函数
public int binarySearch(int[] nums, int target, boolean isFirst) {
// 数组为空或者长度为 0,则直接返回 -1
if (nums == null || nums.length == 0) return -1;
// 初始化左右指针,分别指向数组的第一个和最后一个元素
int left = 0, right = nums.length - 1;
// 开始二分查找
while (left <= right) {
// 计算中间位置
int mid = left + (right - left) / 2;
// 根据 isFirst 参数决定是查找第一个还是最后一个目标值的位置
if ((isFirst && nums[mid] >= target) || (!isFirst && nums[mid] > target)) {
right = mid - 1; // 更新右边界
} else {
left = mid + 1; // 更新左边界
}
}
// 如果是查找第一个目标值,并且左指针超出数组边界,或者找到的值不等于目标值,则返回 -1
// 如果是查找最后一个目标值,并且右指针超出数组边界,或者找到的值不等于目标值,则返回 -1
if ((isFirst && (left >= nums.length || nums[left] != target)) ||
(!isFirst && (right < 0 || nums[right] != target))) return -1;
// 返回找到的目标值的位置
return isFirst ? left : right;
}
public int countTarget(int[] scores, int target) {
int l=0,r=scores.length-1;
int count=0;
int mid=(r-l)/2+l;
if(target<scores[l]|| target>scores[r]) return 0;
while(l<r){
mid=(r-l)/2+l;
if(scores[mid]>target){
r=mid;
}else if(scores[mid]target){
count++;
l=mid+1;
break;
}else{
l=mid+1;
}
}
class Solution {
public int countTarget(int[] scores, int target) {
return getIndex(scores, target) - getIndex(scores, target-1);
}
public int getIndex(int[] scores, int target) {
int l = 0;
int r = scores.length - 1;
while (l <= r) {
int mid = (l+r)/2;
if (scores[mid] <= target) {
l=mid+1;
} else {
r = mid-1;
}
}
return l;
}
}
class Solution {
public:
int countTarget(vector& scores, int target) {
int n = scores.size();
int sum =0;
for(int i = 0; i<n;i++){
if(scores[i] target){
sum++;
}
}
return sum;
class Solution {
public:
int leftBorder(vector<int>& scores, int target){
int l = 0;
int r = scores.size()-1;
int leftBorder = -2;
while(l <= r){
int mid = l + (r-l)/2;
if(scores[mid] >= target){
r = mid - 1;
leftBorder = r;
}else{
l = mid + 1;
}
}
return leftBorder;
}
int rightBorder(vector<int>& scores, int target){
int l = 0;
int r = scores.size()-1;
int rightBorder = -2;
while(l <= r){
int mid = l + (r-l)/2;
if(scores[mid] > target){
r = mid - 1;
}else{
l = mid + 1;
rightBorder = l;
}
}
return rightBorder;
}
int countTarget(vector<int>& scores, int target) {
int left = leftBorder(scores,target);
int right = rightBorder(scores,target);
if(left == -2 || right == -2){
return 0;
}
// cout<<"left :"<<left<<endl;
// cout<<"right:"<<right<<endl;
if(right-left>1)return right-1-(left+1)+1;
return 0;
}
};
java
class Solution{
public int countTarget(int[] scores, int target){
int i = 0, j = scores.length – 1;
while(i <= j){
int m = (i + j) / 2;
if(scores[m] <= target) i = m + 1;
else j = m – 1;
}
int right = i;
if(j >= 0 && scores[j] != target) return 0;
i = 0; j = scores.length – 1;
while(i <= j){
int m = (i + j) / 2;
if(scores[m] < target) i = m + 1;
else j = m – 1;
}
int left = j;
return right – left – 1;
}
}
提交
class Solution {
public int countTarget(int[] scores, int target) {
//target的右界 - target-1的右界 = target的覆盖范围
return helper(scores,target)-helper(scores,target-1);
}
//寻找target出现的右界
private int helper(int[] scores, int target){
int l = 0, r = scores.length - 1;
while(l <= r){
int m = (l+r)/2;
if(scores[m] <= target) l = m+1;
else r = m-1;
}
return l;
}
}
class Solution:
def countTarget(self, scores: List[int], target: int) -> int:
def searchRight(list,target):
left = 0
right = len(list)-1
while left <= right:
mid = (left+right)//2
if list[mid] <= target:
left = mid+1
else:
right = mid -1
return left
return searchRight(scores,target)- searchRight(scores,target-1)
O log N 时间 空间 o 1
“`c++
class Solution {
public:
int countTarget(vector& scores, int target) {
int len = scores.size();
if (len == 0) return 0;
int start = 0, end = len – 1, mid;
while (start <= end) {
mid = (start + end) / 2;
if (scores[mid] >= target) end = mid – 1;
else start = mid + 1;
}
int res = 0;
while (start < len && scores[start] == target) {
start++;
res++;
}
return res;
}
};
```
class Solution {
public int countTarget(int[] scores, int target) {
if(scores.length 0)
return 0;
int begin = 0;
int end = scores.length – 1;
while(begin <= end){
int mid = (begin + end) / 2;
if(target < scores[mid]){
end = mid – 1;
}
else
begin = mid + 1;
}
//循环结束,begin处为右边界
if(end>=0 && scores[end] != target)
return 0;
int right = begin;
end = right;
begin = 0;
while(begin <= end){
int mid = (begin + end) / 2;
if(target <= scores[mid]){
end = mid – 1;
}
else
begin = mid + 1;
}
int left = end;
return right – left – 1;
共以下 24 个回答
class Solution {
public int countTarget(int[] scores, int target) {
int num1 = 0;
int num2 = 0;
int n = scores.length;
}
时间复杂度:O(logn)
空间复杂度:O(1)
class Solution {
public int countTarget(int[] scores, int target) {
// 初始化左右边界,分别用于查找第一个和最后一个目标值的位置
int left = binarySearch(scores, target, true); // 查找第一个目标值的位置
int right = binarySearch(scores, target, false); // 查找最后一个目标值的位置
}
分别查找匹配元素的最小值及最大值对应坐标
public int countTarget(int[] scores, int target) {
int l=0,r=scores.length-1;
int count=0;
int mid=(r-l)/2+l;
if(target<scores[l]|| target>scores[r]) return 0;
while(l<r){
mid=(r-l)/2+l;
if(scores[mid]>target){
r=mid;
}else if(scores[mid]target){
count++;
l=mid+1;
break;
}else{
l=mid+1;
}
}
思路:一次二分加遍历 题解有两次2分 分别找左右边界
时间复杂度(OlogN)
class Solution {& scores, int target) {
public:
int countTarget(vector
int n = scores.size();
int sum =0;
for(int i = 0; i<n;i++){
if(scores[i] target){
sum++;
}
}
return sum;
};
直接遍历
先求出左右边界,然后再根据左右边界相减统计个数
class Solution {& scores, int target) {
public:
int countTarget(vector
if(scores.size() <= 0)
{
return 0;
}
int left =0 ;
int right= scores.size() – 1;
int mid = 0;
// 寻找第一个等于target的索引
while(left < right)
{
mid = left + (right – left)/2;
if(scores[mid] >= target)
{
right = mid;
}
else
{
left = mid+1;
}
}
};
思路:寻找最后一个和第一个等于target的位置
时间复杂度O(log(n))
空间复杂度O(1)
java
class Solution{
public int countTarget(int[] scores, int target){
int i = 0, j = scores.length – 1;
while(i <= j){
int m = (i + j) / 2;
if(scores[m] <= target) i = m + 1;
else j = m – 1;
}
int right = i;
if(j >= 0 && scores[j] != target) return 0;
i = 0; j = scores.length – 1;
while(i <= j){
int m = (i + j) / 2;
if(scores[m] < target) i = m + 1;
else j = m – 1;
}
int left = j;
return right – left – 1;
}
}
提交
时间复杂度O(log(n))
空间复杂度O(1)
时间复杂度O(log(n))
空间复杂度O(1)
“`C++& scores, int target) {
class Solution {
public:
/*自己的代码
int countTarget(vector
int left = 0;
int right = scores.size() – 1;
//特殊情况判断
if(scores.empty() == true)
{
return 0;
}
if (target < scores[0] || target > scores[right])
{
return 0;
}
private:& scores, int target, int l, int r)
//查找最左边的元素
int findleft(vector
{
int left = l;
int right = r;
while(l <= r)
{
int mid = (r + l)/2;
if(target > scores[mid])
{
l = mid + 1;
}
else if(target < scores[mid])
{
r = mid – 1;
}
else
{ //查找最左边的元素就应该在相等的时候让右边的游标移动
r = mid – 1;
}
}
return l;
}
};
“`
打卡
class Solution:
def countTarget(self, scores: List[int], target: int) -> int:
def searchRight(list,target):
left = 0
right = len(list)-1
while left <= right:
mid = (left+right)//2
if list[mid] <= target:
left = mid+1
else:
right = mid -1
return left
return searchRight(scores,target)- searchRight(scores,target-1)
O log N 时间 空间 o 1
思路:直接按照之前的四种模板,查找最后一个小于target的下标,然后从该下标的下一个位置开始遍历,如果等于target,则结果+1,直到不等于target。返回结果。
“`c++& scores, int target) {
class Solution {
public:
int countTarget(vector
int len = scores.size();
if (len == 0) return 0;
int start = 0, end = len – 1, mid;
while (start <= end) { mid = (start + end) / 2; if (scores[mid] >= target) end = mid – 1;
else start = mid + 1;
}
int res = 0;
while (start < len && scores[start] == target) { start++; res++; } return res; } }; ```
思路:寻找第一个等于 target 的数的位置left,寻找最后一个等于 target 的数的位置 right, 最后返回right – left + 1;
class Solution {& scores, int target) {
public:
int countTarget(vector
int l = 0;
int r = scores.size() – 1;
int res = 0;
int flag = -1;
int mid = (l + r) / 2;
while(l <= r){
mid = (l + r) / 2;
if(scores[mid] > target){
r = mid – 1;
}
if(scores[mid] < target){
l = mid + 1;
}
if(scores[mid] target){
flag = mid;
break;
}
}
if(flag -1) return 0;
else{
for(int i = mid; i < scores.size(); i ++){
if(scores[i] target) res ++;
else break;
}
for(int i = mid – 1; i >= 0; i –){
if(scores[i] target) res ++;
else break;
}
}
return res;
}
};
时间复杂度O(logn)空间复杂度O(1)
class Solution {
public int countTarget(int[] scores, int target) {
if(scores.length 0)
return 0;
int begin = 0;
int end = scores.length – 1;
while(begin <= end){
int mid = (begin + end) / 2;
if(target < scores[mid]){
end = mid – 1;
}
else
begin = mid + 1;
}
//循环结束,begin处为右边界
if(end>=0 && scores[end] != target)
return 0;
int right = begin;
end = right;
begin = 0;
while(begin <= end){
int mid = (begin + end) / 2;
if(target <= scores[mid]){
end = mid – 1;
}
else
begin = mid + 1;
}
int left = end;
return right – left – 1;
}
//二分法 时间复杂度O(logn)空间O1
打卡
https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/solutions/2688196/pai-xu-shu-zu-zhong-cha-zhao-by-yukislab-c7r8
重写,套模板& scores, int target) {
class Solution {
public:
int countTarget(vector
int left=0,right=scores.size()-1;
};