旋转有序数组中找到目标值所在的角标

    1. function fn (arr, target) {
    2. if (arr.length === 0) { // 如果数组长度为0 返回-1
    3. return -1;
    4. }
    5. if (arr[0] === target) { // 开头即target 返回0
    6. return 0;
    7. }
    8. if (arr[length - 1] === target) { // 结尾即target
    9. return length - 1;
    10. }
    11. let length = arr.length;
    12. let middle; // 中间值
    13. let low = 0; // 头
    14. let height = length - 1; // 尾
    15. do {
    16. middle = Math.floor((low + height) / 2); // 去中间值
    17. if (arr[middle] === target) { // 如果中间值正好为target
    18. return middle;
    19. }
    20. if (arr[middle] >= arr[0]) { // 如果中间大于开头,说明左边是升序
    21. if (target >= arr[0] && target < arr[middle]) { // target在左边升序之内 将范围缩小
    22. height = middle - 1; // 尾向中间移动
    23. } else {
    24. low = middle + 1; // 头向中间移动
    25. }
    26. } else { // 反之右边是升序
    27. if (target > arr[middle] && target <= arr[length - 1]) { // target在右边
    28. low = middle + 1;
    29. } else {
    30. height = middle - 1;
    31. }
    32. }
    33. } while (low <= height);
    34. return -1;

    https://blog.csdn.net/zjw_python/article/details/106505557