LeetCode:求有序数组的目标元素出现首末位置

/*
题目描述:
给定一个增序的整数数组和一个值,查找该值第一次和最后一次出现的位置

示例:
输入的是一个数组和一个值,输出为该值第一次出现的位置和最后一次出现的位置(从0开始);
如果不存在该值,则返回值都设为-1.

Input:nums=[5,7,7,8,8,10],target=8
Output:[3,4]

解题思路:
解法一:利用二分查找的思想,调用lower_bound和upper_bound两个函数,使用左闭右开的写法
解法二:利用multimap容器,equal_range函数
*/

C++语言实现 

#include <iostream>
#include <vector>
#include <map>


using namespace std;

class Solution{
public:
     Solution(vector<int>& _nums,const int& _target):nums(_nums),target(_target){}
     vector<int> searchRange(){
         multimap<int,int> num;
         for(int i=1;i<=nums.size();i++)
             num.insert(make_pair(nums[i-1],i));

         pair<multimap<int,int>::iterator,multimap<int,int>::iterator> it=num.equal_range(target);
         /*若键不存在,则返回同一个迭代器,指向依据元素的排列顺序该键应该插入的位置*/
         if(it.first==it.second){
             return vector<int>{-1,-1};
         }else{
             return vector<int>{it.first->second,(--it.second)->second};
         }
    }
private:
     vector<int> nums;
     int target;
};

int main(int argc,char* argv[]){
    vector<int> nums={5,7,7,8,8,10};
    Solution solu(nums,8);
    vector<int> result=solu.searchRange();
    for(auto& num:result)
        cout<<num<<"  ";
    cout<<endl;
    return 0;
}

Go语言实现 

package main

import "fmt"

func searchRange(nums []int,target int)(lower,upper int){
	if len(nums)==0{
		lower,upper=-1,-1
		return
	}
	lower=lowerBound(nums,target)
	upper=upperBound(nums,target)-1 /*这里需要减1*/
	/*判断target是否大于数组最大值或者最小值*/
	if lower==len(nums)||nums[lower]!=target{
		lower,upper=-1,-1
		return
	}
	return
}
func lowerBound(nums []int,target int)int{
	L,R,Mid:=0,len(nums),0
	for L<R{
		Mid=(L+R)/2
		if nums[Mid]>=target{
			R=Mid
		}else{
			L=Mid+1
		}
	}
	return L
}

func upperBound(nums []int,target int)int{
	L,R,Mid:=0,len(nums),0
	for L<R{
		Mid=(L+R)/2
		if nums[Mid]>target{
			R=Mid
		}else{
			L=Mid+1
		}
	}
	return L
}
func main(){
	fmt.Println("求增序数组中第一次和最后一次出现的位置")
	nums:=[]int{5,7,7,8,8,10}

	lower,upper:=searchRange(nums,13)
	fmt.Println(lower," ",upper)
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值