算法每日一刷

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

2019-10-25  本文已影响0人  entre_los_dos

来源:力扣(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!]
        
    }
上一篇 下一篇

猜你喜欢

热点阅读