題目:統計一個數字在排序數組中出現的次數。例如輸入排序數組{1,2,3,3,3,3,4,5}和數字3,由于3在這個數組中出現了4次,因此輸出4.
最簡單的是一次遍歷,但是更高效的方法是二分查找,需要略微改變.
核心代碼:
<pre><code>`
func searchNumberOfK(arr:[Int],num:Int) -> Int? {
if arr.count == 0 {
return nil
}
let first:Int? = searchFirstOfK(arr: arr, num: num)
let last:Int? = searchLastOfK(arr: arr, num: num)
if first == nil || last == nil {
return nil
} else {
let count:Int = last! - first! + 1
return count
}
}
func searchFirstOfK(arr:[Int],num:Int) -> Int? {
var low:Int = 0
var high:Int = arr.count - 1
while low <= high {
let mid:Int = (low + high)/2
if arr[mid] > num {
high = mid - 1
} else if arr[mid] < num {
low = mid + 1
} else {
if (mid > 0 && arr[mid-1] != num) || mid == 0 {
return mid
} else {
high = mid - 1
}
}
}
return nil
}
func searchLastOfK(arr:[Int],num:Int) -> Int? {
var low:Int = 0
var high:Int = arr.count - 1
while low <= high {
let mid:Int = (low + high)/2
if arr[mid] > num {
high = mid - 1
} else if arr[mid] < num {
low = mid + 1
} else {
if (mid < arr.count - 1 && arr[mid+1] != num) || mid == arr.count - 1 {
return mid
} else {
low = mid + 1
}
}
}
return nil
}`</code></pre>
測試代碼:
<pre><code>`
var sortArr:[Int] = [1,2,3,3,3,3,4,5]
var sortTarget:Int = 1
var sortCount:Int? = binarySearch.searchNumberOfK(arr: sortArr, num: sortTarget)
if sortCount == nil {
print("FlyElephant-(sortArr)不存在數字-(sortTarget)")
} else {
print("FlyElephant-(sortArr)中數字-(sortTarget)的次數--(sortCount!)")`</code></pre>