Circular Sorted Array
2018-08-05 本文已影响5人
超薄智能
Find the head index in a circular sorted array.
- binary search
- use remainder in a circular is much easier
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--');
- Solution with remainder/ references
https://www.youtube.com/watch?v=4qjprDkJrjY&list=PL2_aWCzGMAwLPEZrZIcNEq9ukGWPfLT4A&index=3