日常刷题0x26之未出新手村

185 阅读2分钟

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

题号:81
//利用map这样又太简单了应该不会让这样
var search = function (nums, target) {
    let map = new Map()
    nums.forEach((item) => {
        map.set(item, 1)
    });
    return map.has(target)
};

//复习二分查找
//一般有序数组中找目标要想到二分查找
//当想到二分查找就要时刻注意细节问题
var search = function (nums, target) {

    //先把数组调整为升序
    nums.sort((a, b) => {
        return a - b
    })
    //升序完开始二分搜索
    let left = 0, right = nums.length - 1
    while (left <= right) {
        let mid = Math.floor(left + (right - left) / 2)
        if (nums[mid] == target) {
            //找到
            return true
        } else if (nums[mid] > target) {
            right = mid - 1
        } else {
            left = mid + 1
        }
    }
    return false
}
题号:153
var findMin = function (nums) {
    //一个元素直接返回
    if (nums.length == 1) {
        return nums[0]
    }
    //首尾比较观察是否就是有序数组,是就返回首元素
    if (nums[0] < nums[nums.length - 1]) {
        return nums[0]
    }
    //走到这里说明nums符合一个特性:从首元素开始升序然后到某个元素开始出现一个拐点
    //那个拐点之后第一个元素就是要找的值
    let left = 0, right = nums.length - 1
    while (left <= right) {
        let mid = Math.floor(left + (right - left) / 2)

        if (nums[mid] < nums[mid - 1]) {
            //mid指向的元素如果小于前一个元素,那么此时mid就是要找的最小值
            return nums[mid]
        } else {
            //收缩范围
            //mid指向的元素大于nums的尾元素那么说明要找的值落在拐点右边去右边找
            //反之落在左边
            if (nums[mid] > nums[nums.length - 1]) {
                left = mid + 1
            } else {
                right = mid - 1
            }
        }
    }
};
题号:剑指offer11
//此类题首先想到在数组内有一个拐点
var minArray = function (numbers) {
    let left = 0, right = numbers.length - 1
    while (left <= right) {
        let mid = Math.floor(left + (right - left) / 2)
        if (numbers[mid] > numbers[right]) {
            //此种情况拐点一定在mid右边
            left = mid + 1
        } else if (numbers[mid] < numbers[right]) {
            //此种情况拐点一定在mid左边或者是mid(所以不能mid-1)
            right = mid
        } else {
            //此种情况有点复杂,我不能断定拐点在mid左还是右
            //我如果断定在左的话,可以举一个例子推翻:2,2,2,2,5,1,2,2
            //我如果断定在右的话,可以举一个例子推翻:2,2,2,2,5,2,2
            //那么此时此刻我能做啥?
            //我把right缩小1,缩小一个范围继续搜索,因为我能保证我缩小这1个范围之后要找的结果还在区间内
            right--
        }
    }
    return numbers[left]
};