先刷到的35,涉及到二分查找。于是把704也做一遍。


704_二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

 
提示:

你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function (nums, target) {
    //左边界
    var left = 0;
    //右边界
    var right = nums.length - 1;
    //中间索引
    var flag = 0;
    //循环 只要左小于等于右说明没有查找完成。
    while (left <= right) {
    //修改flag
        flag = parseInt(left + (right - left) / 2);
    //如果target == 数组中间索引位置的值则 直接返回flag
    //如果target <  数组中间索引位置的值则 右边界就等于中间索引左移一位的位置
    //如果target >  数组中间索引位置的值则 左边界就等于中间索引右移一位的位置
        if (target == nums[flag]) return flag;
        if (target < nums[flag]) {
            right = flag - 1;
        } else if (target > nums[flag]) {
            left = flag + 1;
        }
    }
    //如果循环结束则  没有 查找到直接返回-1
    return -1;
};

35_搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5
输出: 2

示例 2:

输入: [1,3,5,6], 2
输出: 1

示例 3:

输入: [1,3,5,6], 7
输出: 4

示例 4:

输入: [1,3,5,6], 0
输出: 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-insert-position
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一

简单粗暴的解法。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function (nums, target) {
    //循环数组
    for (let i = 0; i < nums.length; i++) {
    //如果当前循环位置的数大于等于目标数
    //则可以证明无论插入还是查询到,目标位置都为当前索引直接返回
        if (nums[i] >= target) {
            return i;
        }
    }
    return nums.length;
};

方法二

二分法 时间复杂度O(logn)
区别在于,如果没有搜索到就直接返回左边界下标就ok

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function (nums, target) {
    var left = 0;
    var right = nums.length - 1;
    var flag = 0;
    while (left <= right) {
        flag = parseInt(left + (right - left) / 2);
        if (target == nums[flag]) return flag;
        if (target < nums[flag]) {
            right = flag - 1;
        } else if (target > nums[flag]) {
            left = flag + 1;
        }
    }
    return left;
};