Circular Sorted Array

2018-08-05  本文已影响5人  超薄智能

Find the head index in a circular sorted array.

midLeftIndex = (mid-1+N)%N
midRightIndex = (mid+1)%N
// Key point:
a[headIndex]<a[midLeftIndex] && a[headIndex]<a[midRightIndex]

// My solution
// A harder way to check all the conditions without use remainder
console.log('--Binary search in circular array--');

var findHeadIndex = function (arr) {
    var headIndex = -1;
    var start = 0;
    var end = arr.length - 1;
    while (start <= end) {
        var mid = Math.floor((start + end) / 2);
        if (arr[mid] < arr[start]) {
            if (mid == start + 1) {
                headIndex = mid;
                break;
            } else {
                end = mid - 1;
            }
        } else if (arr[mid] > arr[end]) {
            if (mid == end - 1) {
                headIndex = end;
                break;
            } else {
                start = mid + 1;
            }
        } else {
            headIndex = start;
            break;
        }
        if (start == end) {
            headIndex = start;
            break;
        }
    }
    return headIndex;
}

console.log('--start testing--');
var a1 = [1, 2, 3, 4, 5, 6, 7];
var a2 = [6, 7, 1, 2, 3, 4, 5];
var a3 = [4, 5, 6, 7, 1, 2, 3];
var b1 = [1, 2, 3, 4, 5, 6, 7, 8];
var b2 = [7, 8, 1, 2, 3, 4, 5, 6];
var b3 = [4, 5, 6, 7, 8, 1, 2, 3];
var arr = [a1, a2, a3, b1, b2, b3];
var res = [];
for (var index in arr) {
    res.push(findHeadIndex(arr[index]));
};
console.log(res.join(' '));
console.log('--end--');


上一篇 下一篇

猜你喜欢

热点阅读