class Solution {
public int[] searchRange(int[] nums, int target) {
//两次二分查找
int left = firstTarget(nums, target);
int right = lastTarget(nums, target);
return new int[]{left, right};
}
public int firstTarget(int[] nums, int target) {
int left = 0, right = nums.length - 1;
int first = -1;
while(left <= right) {
int mid = (left + right) / 2;
if(nums[mid] == target) {
first = mid;
right = mid - 1;
}else if(nums[mid] > target) {
right = mid - 1;
}else {
left = mid + 1;
}
}
return first;
}
public int lastTarget(int[] nums, int target) {
int left = 0, right = nums.length - 1;
int last = -1;
while(left <= right) {
int mid = (left + right) / 2;
if(nums[mid] == target) {
last = mid;
left = mid + 1;
}else if(nums[mid] > target) {
right = mid - 1;
}else {
left = mid + 1;
}
}
return last;
}
}
public:
int search(vector& nums, int target) {
int len = nums.size();
if(!len) return 0;
int left = 0;
int right = len;
//left
while(left < right){
int mid = left + (right – left)/2;
if(nums[mid] target){
right = mid;
}else if(nums[mid] > target){
right = mid;
}else if(nums[mid] < target){
left = mid + 1;
}
}
if(left > right && left > len – 1) return -1;
else lc = left;
while(left < right){
int mid = left + (right - left)/2;
if(nums[mid] == target){
left = mid + 1;
}else if(nums[mid] > target){
right = mid;
}else if(nums[mid] < target){
left = mid + 1;
}
}
if(left > right && left > len - 1) return -1;
else rc = left - 1;
return rc - lc + 1;
}
”’java
class Solution {
public int search(int[] nums, int target) {
//找到第一个大于target的下标和最后一个小于target的下标
int r = upper(nums,target);
int l = lower(nums,target);
if(r -1 && l -1){
return nums.length;
}
if(l -1 && r != -1){
return r;
}
if(r -1 && l != -1){
return nums.length – l -1;
}
if(r – l <= 1){
return 0;
}
return r – l – 1;
}
public int upper(int[] arr,int target){
int l = 0;
int r = arr.length – 1;
if(r < 0 || arr[r] <= target){
return -1;
}
while(l < r){
int mid = (l + r)/2;
if(arr[mid] > target){
r = mid;
}else{
l = mid + 1;
}
}
return l;
}
//找到最后一个小于target的
public int lower(int[] arr,int target){
int l = 0;
int r = arr.length – 1;
if(r < 0 || arr[l] >= target){
return -1;
}
while(l < r){
int mid = (l + r + 1)/2;
if(arr[mid] < target){
l = mid;
}else{
r = mid -1;
}
}
return l;
}
}
”’
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
if(n==0) return 0;
//先找到该目标数,然后再统计
int l=0,r=n-1;
while(l<r) {
int mid = l+(r-l)/2;
if(nums[mid]<target) l=mid+1;
else r=mid;
}
int cnt=0;
while(l<n&&nums[l++]==target) {
cnt++;
}
return cnt;
}
}
class Solution {
int count = 0;
public int search(int[] nums, int target) {
if(nums.length==0) return 0;
// 二分查找
int left = floor_lower(nums, target);
int right = floor_upper(nums, target);
if(left<0 || right <0) return 0;
return right-left+1;
}
// 找到第一个等于/小于target的数
// 没有等于,就小于
public int floor_lower(int[] nums, int target){
int left = 0;
int right = nums.length-1;
if(nums[left]>target) return -1;
// 左闭右闭
while(left<=right){
int middile = (right-left)/2 + left;
if(nums[middile]>target){
right = middile-1;
} else if(nums[middile]==target){
// 等于的时候,仍然要往左找,看有没有更小的坐标
right = middile-1;
} else{
left = middile + 1;
}
}
return right+1;
}
// 找到最后一个等于target的数,或者第一个大于target的数
public int floor_upper(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
if(nums[right]<target) return -1;
while(left<=right){
int middile = (right-left)/2 + left;
if(nums[middile]>target){
right = middile-1;
} else if(nums[middile]==target){
// 等于的时候,仍然要往右找,看有没有更大的坐标
left = middile+1;
} else{
left = middile + 1;
}
}
return left-1;
}
}
class Solution {
public int search(int[] nums, int target) {
int left = search1(nums, target);
int right = search2(nums, target);
if(left<0||right<0){
return 0;
}
return right-left+1;
}
int search1(int[] nums, int target){
if(nums==null||nums.length<=0) return -1;
int l=0;
int r=nums.length-1;
while(l<r){
int mid = (r-l)/2+l;
if(nums[mid]>=target){
r = mid;
}else{
l = mid+1;
}
}
if(nums[l]!=target) return -1;
return l;
}
int search2(int[] nums, int target){
if(nums==null||nums.length<=0) return -1;
int l=0;
int r=nums.length-1;
while(l<r){
int mid = (r-l+1)/2+l;
if(nums[mid]<=target){
l = mid;
}else{
r = mid-1;
}
}
if(nums[l]!=target) return -1;
return l;
}
}
func search(nums []int, target int) int {
//第一个等于target的元素下标
leftbound := func(nums []int, target int) int {
left := 0
right := len(nums) - 1
for left <= right {
mid := left + (right-left)/2
//[left, mid, right]
if nums[mid] == target {
right = mid - 1
} else if nums[mid] < target {
left = mid + 1
} else if nums[mid] > target {
right = mid - 1
}
}
if left < 0 || left >= len(nums) {
return -1
}
if nums[left] == target {
return left
}
return -1
}
rightbound := func(nums []int, target int) int {
left := 0
right := len(nums) - 1
for left <= right {
mid := left + (right-left)/2
//[left, mid, right]
if nums[mid] == target {
left = mid + 1
} else if nums[mid] < target {
left = mid + 1
} else if nums[mid] > target {
right = mid - 1
}
}
if right < 0 || right >= len(nums) {
return -1
}
if nums[right] == target {
return right
}
return -1
}
left := leftbound(nums, target)
right := rightbound(nums, target)
if left == -1 || right == -1 {
return 0
}
return right - left + 1
}
c++ 代码这样也能过
class Solution {
int t=0;
public:
int search(vector& nums, int target)
{
for(int i=0;i<nums.size();i++)
{
if(targetnums[i])
t++;
}
return t;
}
};
class Solution {
public int search(int[] nums, int target) {
return helper(nums, target) - helper(nums, target - 1);
}
public int helper(int[] nums, int target){
int i = 0, j = nums.length - 1;
while(i <= j){
int m = (i + j) >> 1;
if(nums[m] <= target) i = m + 1;
else j = m - 1;
}
return i;
}
}
class Solution {
public int search(int[] nums, int target) {
int l = 0, r = nums.length - 1;
if(nums == null) return 0;
while(l <= r) {
int mid = l + r >> 1;
if(nums[mid] >= target) r = mid - 1;
else l = mid + 1;
}
int leftIndex = l;
l = 0; r = nums.length - 1;
while(l <= r) {
int mid = l + r >> 1;
if(nums[mid] > target) r = mid - 1;
else l = mid + 1;
}
int rightIndex = r;
return rightIndex - leftIndex + 1;
}
}
共以下 23 个回答
class Solution {
private:
int lc;
int rc;
public:& nums, int target) {
int search(vector
int len = nums.size();
if(!len) return 0;
int left = 0;
int right = len;
//left
while(left < right){
int mid = left + (right – left)/2;
if(nums[mid] target){
right = mid;
}else if(nums[mid] > target){
right = mid;
}else if(nums[mid] < target){
left = mid + 1;
}
}
if(left > right && left > len – 1) return -1;
else lc = left;
};//滴滴
“`c++代码& nums, int target) {
class Solution {
public:
int search(vector
return upper_bound(nums.begin(), nums.end(), target)-lower_bound(nums.begin(), nums.end(), target);
}
};
做的是34题,输出不一样而已
时间复杂度:O(logn)
空间复杂度:O(1)
”’java
class Solution {
public int search(int[] nums, int target) {
//找到第一个大于target的下标和最后一个小于target的下标
int r = upper(nums,target);
int l = lower(nums,target);
if(r -1 && l -1){
return nums.length;
}
if(l -1 && r != -1){
return r;
}
if(r -1 && l != -1){
return nums.length – l -1;
}
if(r – l <= 1){
return 0;
}
return r – l – 1;
}
public int upper(int[] arr,int target){
int l = 0;
int r = arr.length – 1;
if(r < 0 || arr[r] <= target){
return -1;
}
while(l < r){
int mid = (l + r)/2;
if(arr[mid] > target){
r = mid;
}else{
l = mid + 1;
}
}
return l;
}
//找到最后一个小于target的
public int lower(int[] arr,int target){
int l = 0;
int r = arr.length – 1;
if(r < 0 || arr[l] >= target){
return -1;
}
while(l < r){
int mid = (l + r + 1)/2;
if(arr[mid] < target){
l = mid;
}else{
r = mid -1;
}
}
return l;
}
}
”’
时间O(long)
时间复杂度:O(log(N))
空间复杂度:O(n)
时间复杂度:O(logn)
空间复杂度:O(n)
代码
class Solution {
public int search(int[] nums, int target) {
//排好序的数组 一般都是二分
//用二分找 找了左右遍历
int left =0;
int result =0;
int right = nums.length-1;
if(nums.length0)
{
return 0;
}
int mid = 0;
while(left<=right)
{
mid=(left+right)/2;
if(nums[mid]target)
{
break;
}
if(nums[mid]>target)
{
right=mid – 1;
}else
{
left = mid + 1;
}
}
if(mid>=0&&mid<=nums.length-1&&nums[mid]target)
{
int zuo =mid -1;
int you = mid +1;
result = 1 ;
while(zuo>=0&&nums[zuo]target)
{
zuo–;
result++;
}
while(you<=nums.length-1&&nums[you]target)
{
you++;
result++;
}
}
return result;
}
二分➕前后循环遍历
暴力
c++ 代码这样也能过& nums, int target)
class Solution {
int t=0;
public:
int search(vector
{
for(int i=0;i<nums.size();i++)
{
if(targetnums[i])
t++;
}
return t;
}
};
模板题,背模板就完事了
7.22
Day14:下面是代码
两次二分,求左右边界,右边界 – 左边界 + 1即可