旋转数组

179 阅读1分钟

问:搜索旋转数组。给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详。请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的。若有多个相同元素,返回索引值最小的一个。

示例1:

输入: arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 5 输出: 8(元素5在该数组中的索引)

(问题来自力扣) 答:

/**
 * @param {number[]} arr
 * @param {number} target
 * @return {number}
 */
var search = function(arr, target) {
    let left = 0
    let right = arr.length - 1
    while(left < right) {
        let piviot = left + Math.floor((right - left) / 2)
        console.log(left, right)
        if (arr[left] < arr[piviot]) {
            if (arr[left] <= target && target <= arr[piviot]) {
                console.log('----', right)
                right = piviot
            } else {
                left = piviot + 1
            }
        } else if (arr[left] > arr[piviot]) {
            if (arr[left] <= target || target <= arr[piviot]) {
                right = piviot
            } else {
                left = piviot + 1
            }
        } else if (arr[left] === arr[piviot]) {
            if (target !== arr[left]) {
                left++      
            } else {
                right = left
            }
        }
    }
    return (arr[left] === target) ? left : -1
};

时间复杂度O(logn)