1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| import Foundation
class For38Solution { func findNumsOfK(_ nums: [Int],_ k: Int) -> Int { var n = nums let fisrt = getFirstK(&n, k, 0, n.count-1) let last = getLastK(&n, k, 0, n.count-1) if fisrt == -1 || last == -1 { //没找到 return -1 } return last - fisrt + 1 } func getFirstK(_ nums: inout [Int],_ k: Int,_ start1: Int,_ end1: Int) -> Int { var start = start1 var end = end1
if start > end { return -1 } let mid = (start + end) / 2 let midNum = nums[mid] if midNum == k { if mid == 0 || (mid > 0 && nums[mid - 1] != k) { return mid }else { end = mid - 1 } }else if midNum > k { end = mid - 1 }else { start = mid + 1 } return getFirstK(&nums, k, start, end) } func getLastK(_ nums: inout [Int],_ k: Int,_ start1: Int,_ end1: Int) -> Int { var start = start1 var end = end1 if start > end { return -1 } let mid = (start + end) / 2 let midNum = nums[mid] if midNum == k { if mid == end || (mid < end && nums[mid+1] != k) { return mid }else { start = mid + 1 } }else if midNum < k { start = mid + 1 }else { end = mid - 1 } return getLastK(&nums, k, start, end) }
}
|