在排序数组中查找第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是 O(log n) 级别。

如果数组中不存在目标值,返回 [-1, -1]。

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        i=0
        j=len(nums)-1
        bChanged=False
        while (i<=j):
            if((nums[i]==target )and(nums[j]==target)  ):
                bChanged=True
                break
            if(nums[i]!=target):
                i+=1
            if(nums[j]!=target):
                j-=1
            
        if(bChanged):
            return [i,j]
        else :
            return [-1,-1]
        

class Solution:
    
    def search_index(self ,nums,target,LeftOrRight):
        left=0
        right=len(nums)
        while (left<right):
            mid=(left+right)//2
            if((nums[mid]>target) or (LeftOrRight and nums[mid]==target)):
                right=mid
            elif((nums[mid]<target)or(not LeftOrRight and nums[mid]==target)):
                left=mid+1
        return left



    def searchRange(self, nums, target):
        left_index=self.search_index(nums,target,True)
        if(len(nums)==1 and nums[0]==target):
            return[0,0]
        if( left_index >=len(nums) or len(nums)==0 or nums[left_index]!=target):
            return [-1,-1]
        right_index=self.search_index(nums,target,False)-1

        return [left_index,right_index]


class Solution:

    def searchRange(self, nums, target):
        left=0
        right=len(nums)-1
        while (left<right):
            mid=(left+right)/2
            if(nums[mid]<target):
                left=mid+1
            elif(nums[mid]>=target):
                right=mid
        if(len(nums)==0 or nums[left]!=target):
            return [-1,-1]
        new_left=left
        new_right=len(nums)-1
        while (new_left<new_right):
            mid=(new_left+new_right+1)/2
            if(nums[mid]>target):
                new_right=mid-1
            elif(nums[mid]<=target):
                new_left=mid
        return[left,new_left]

根据题目要求运用二分查找即可,问题主要是边界条件的确定,没想到有啥好办法,我是通过一遍遍调试来搞的,
希望大神看到能教教我这个边界条件应该怎么搞。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值