Swift-魔術索引

題目:在數組A[0..n-1]中,有所謂的魔術索引,滿足條件A[i]=i。給定一個升序數組,元素值各不相同,編寫一個方法,判斷在數組A中是否存在魔術索引.

數組中不存在重復數據可以通過二分法來實現:

func magicFast(arr:inout [Int],start:Int,end:Int) -> Int {
        if arr.count == 0 || start < 0 || end >= arr.count || end < start {
            return -1
        }
        
        let mid:Int = (start + end) / 2
        
        let midValue:Int = arr[mid]
        
        if mid == midValue {
            return mid
        } else if midValue > mid {
            return magicFast(arr: &arr, start: start, end: mid - 1)
        } else {
             return magicFast(arr: &arr, start: mid + 1, end: end)
        }
    }

數據中存在重復數據:

   func magicFast2(arr:inout [Int],start:Int,end:Int) -> Int {
        if arr.count == 0 || start < 0 || end >= arr.count || end < start {
            return -1
        }
        
        let mid:Int = (start + end) / 2
        
        let midValue:Int = arr[mid]
        
        
        if mid == midValue {
            return mid
        }
        
        let leftIndex:Int = min(mid - 1, midValue)
        let left:Int = magicFast2(arr: &arr, start: start, end: leftIndex)
        if left >= 0 {
            return left
        }
        
        let rightIndex:Int = max(mid + 1, midValue)
        let right:Int = magicFast2(arr: &arr, start: rightIndex, end: end)
        return right
    }

測試代碼:

var magicArr:[Int] = [-40, -20, -1, 1, 2, 3, 5, 7, 9, 12, 13]
var magicIndex:Int = recursion.magicFast(arr: &magicArr, start: 0, end: magicArr.count - 1)
print("FlyElephant---\(magicArr)中間值:\(magicIndex)")

magicArr = [-10, -5, 2, 2, 2, 3, 4, 7, 9, 12, 13]
magicIndex = recursion.magicFast2(arr: &magicArr, start: 0, end: magicArr.count - 1)
print("FlyElephant---\(magicArr)中間值:\(magicIndex)")
FlyElephant.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容