美文网首页算法每日一刷
LeetCode算法题-34. 在排序数组中查找元素的第一个和最

LeetCode算法题-34. 在排序数组中查找元素的第一个和最

作者: entre_los_dos | 来源:发表于2019-10-25 19:46 被阅读0次

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

    题目

    给定一个按照升序排列的整数数组 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]
    

    方法

     func searchRange(_ nums: [Int], _ target: Int) -> [Int] {
            
            var startIndex = 0
            var endIndex = nums.count-1
            
            while startIndex < endIndex {
                
                let middleIndex = startIndex + (endIndex - startIndex)/2
                if nums[middleIndex] == target {
                    
                    return findNums(nums, middleIndex)
                }else if nums[middleIndex] < target {
                    
                    startIndex = middleIndex + 1
                }else {
                    
                    endIndex = middleIndex - 1
                }
                
            }
            
            if startIndex == endIndex {
                if nums[startIndex] == target {
                    return [startIndex,startIndex]
                }
                return [-1,-1]
    
            }
            
            return [-1,-1]
        }
        
        func findNums(_ nums: [Int], _ index: Int) -> [Int] {
            
            var result = [index]
            
            var leftIndex = index - 1
            var rightIndex = index + 1
            
            while leftIndex >= 0 || rightIndex < nums.count {
                
                if leftIndex >= 0 {
                    if nums[leftIndex] == nums[index] {
                        result.insert(leftIndex, at: 0)
                        leftIndex -= 1
                    }else {
                        leftIndex = -1
                    }
                }
                
                if rightIndex < nums.count {
                    if nums[rightIndex] == nums[index] {
                        result.append(rightIndex)
                        rightIndex += 1
                    }else {
                        rightIndex = nums.count
                    }
                }
            }
                   
            if result.count == 1 {
                result.append(result[0])
            }
    
            return [result.first!,result.last!]
            
        }
    

    相关文章

      网友评论

        本文标题:LeetCode算法题-34. 在排序数组中查找元素的第一个和最

        本文链接:https://www.haomeiwen.com/subject/mmjevctx.html