过年自律第六天

128 阅读1分钟

如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想自己作为自律工具趁着过年没事每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的

2021放假第六天,2月11日

二分查找

题号:剑指offer53一
var search = function (nums, target) {
    let left = 0, right = nums.length - 1
    let center = 0, total = 0
    while (left <= right) {
        let mid = Math.floor(left + (right - left) / 2)
        if (nums[mid] == target) {
            //数组中可能存在连续的给定target,根据二分查找找到一个target
            //具体这个找到的target在连续数组中的位置不关心,找到一个就行
            //以找到的那个target为中心扩散找相同的target
            let i = mid, j = mid
            total++
            while (true) {
                i--
                if (i < 0 || nums[i] < target) {
                    break
                } else {
                    total++
                }
            }
            while (true) {
                j++
                if (j > nums.length - 1 || nums[j] > target) {
                    break
                } else {
                    total++
                }
            }
            break
        } else if (nums[mid] < target) {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return total
};
题号:剑指offer53二
var missingNumber = function (nums) {
    let left = 0, right = nums.length - 1
    while (left <= right) {
        //这里向上向下取整都一样
        let mid = Math.ceil(left + (right - left) / 2)
        if (mid == nums[mid]) {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    //最后出结果的时候left一定是不满足<=right的,left从mid == nums[mid]到不满足mid == nums[mid]然后跳出while
    //的left值就是那个临界值右边第一个满足mid != nums[mid]的值
    return left
};
题号:167
var twoSum = function (numbers, target) {
    for (let i = 0; i < numbers.length; i++) {
        let left = i + 1, right = numbers.length - 1
        while (left <= right) {
            let mid = Math.round(left + (right - left) / 2)
            if (numbers[mid] == target - numbers[i]) {
                //找到
                //+1满足题意的下标从1开始不是从0开始
                return [i + 1, mid + 1]
            } else if (numbers[mid] > target - numbers[i]) {
                right = mid - 1
            } else {
                left = mid + 1
            }
        }
    }
    return []
};

var twoSum = function (numbers, target) {
    let left = 0, right = numbers.length - 1
    while (left <= right) {
        if (numbers[left] + numbers[right] == target) {
            return [left + 1, right + 1]
        } else if (numbers[left] + numbers[right] < target) {
            left++
        } else {
            right--
        }
    }
    return []
};