zoukankan      html  css  js  c++  java
  • 每日一道 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;
    }
    

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

  • 相关阅读:
    IM 融云 之 初始化及登录
    IM 融云 之 安装cocoapods 安装 SDK
    github desktop 下载
    iOS 架构模式
    IM 融云 之 通讯能力库API
    IM 融云 之 开发基础概念
    IM 之 融云
    php获得文件的属性
    js模拟复制
    linux修改yum源
  • 原文地址:https://www.cnblogs.com/babycomeon/p/13456718.html
Copyright © 2011-2022 走看看