LeetCode算法题-34. 在排序数组中查找元素的第一个和最后一个位置(Swift)

来源:力扣(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!]
        
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容