每日一道 LeetCode (10):搜索插入位置

每天 3 分钟,走上算法的逆袭之路。

前文合集

每日一道 LeetCode 前文合集

代码仓库

GitHub: https://github.com/meteor1993/LeetCode

Gitee: https://gitee.com/inwsy/LeetCode

题目:搜索插入位置

题目来源:https://leetcode-cn.com/problems/search-insert-position/

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

你可以假设数组中无重复元素。

示例 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

解题思路:暴力方案

经常看我文章的同学看到这这道题都应该感觉是小意思了,最简单也是最好想的方案,直接迭代数字,用目标字符进行比较,如果大于等于当前的字符,直接返回当前的位置就好,如果一直都没达成这个条件,说目标字符是最大的,循环结束返回。

感觉说的太抽象了,直接上代码比较简洁:

public int searchInsert(int[] nums, int target) {

    if (nums[nums.length - 1] < target) return nums.length;

    for (int i = 0; i < nums.length; i++) {
        if (nums[i] >= target) {
            return i;
        }
    }
    return 0;
}

解题思路:二分法

既然这道题的主要考察的是查找位置,怎么能少得了我赫赫有名的「二分法」。

尴尬的是我在做这道题的时候并没有想到这个算法,看来还是刷题少,需要多加练习。

二分法的思路就不介绍了吧,这个思路不清楚可以单独私信我。

直接上代码:

public int searchInsert_1(int[] nums, int target) {
    int n = nums.length;
    int left = 0, right = n - 1, ans = n;
    while (left <= right) {
        int mid = ((right - left) >> 1) + left;
        if (target <= nums[mid]) {
            ans = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return ans;
}

上面这两种方法虽然得到了相同的执行用时,在大量数据的情况下应该是二分法所使用的耗时更少,毕竟暴力方案在最差的情况下需要每次都把整个数组遍历一遍,而相对而言二分法所需要的平均循环次数更少。

posted @ 2020-08-08 10:41  极客挖掘机  阅读(231)  评论(0编辑  收藏  举报