【JAVA】搜索插入位置——力扣每日一题(五)(2020.07.17)

   日期:2020-07-18     浏览:126    评论:0    
核心提示:目录题目:35. 搜索插入位置思路方法一:暴力方法二:二分法如果你从本文中学习到丝毫知识,那么请您点点关注、点赞、评论和收藏大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博客为:爱做梦的鱼https://zihao.blog.csdn.net/,微信公众号、微信视频号为【程序猿干货铺】如果你同样热爱算法,那么请关注我,我将每日更新力扣的每日一题的题解+代码,每周更新力扣周赛题解+代码本题Python代码版专栏《力扣每日一题》专栏《力扣周赛》

目录

  • 题目:35. 搜索插入位置
  • 思路
    • 方法一:暴力
    • 方法二:二分法

如果你从本文中学习到丝毫知识,那么请您点点关注、点赞、评论和收藏
大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博客为:爱做梦的鱼https://zihao.blog.csdn.net/,微信公众号、微信视频号为【程序猿干货铺】,qq交流群为:1107710098,

如果你同样热爱算法,那么请关注我,我将每日更新力扣的每日一题的题解+代码,每周更新力扣周赛题解+代码
《本题Python代码版》
专栏《力扣每日一题》
专栏《力扣周赛》
专栏《力扣大厂模拟面试算法题》

题目: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

思路

本题需要考虑两种情况

  1. 目标值存在,返回其索引。
    公式一:target = nums[pos]
  2. 目标值不存在于数组中,返回它将会被按顺序插入的位置。
    1. 普遍情况,公式二:nums[pos−1] < target < nums[pos] 返回的索引为pos[1,n-1]
    2. 边界情况一targer < nums[0] 返回的索引为0
    3. 边界情况二target > nums[n-1] 返回的索引为n

合并公式一二,可以得出我们本题的公式三(普遍情况)公式三:nums[pos−1] < target <= nums[pos]
「在一个有序数组中找第一个大于等于target 的下标」 (本题中提示:你可以假设数组中无重复元素。)
最终公式为,两种边界情况+公式三
targer < nums[0] 返回的索引为0
target > nums[n-1] 返回的索引为n
nums[pos−1] < target <= nums[pos] 返回的索引为pos[1,n-1]

方法一:暴力

public class SearchInsertPosition {
    public static void main(String[] args) {
        int[] a = {1, 3, 5, 6};
        System.out.println(new Solution().searchInsert(a, 5));
        System.out.println(new Solution().searchInsert(a, 1));
        System.out.println(new Solution().searchInsert(a, 6));
    }
}

//代码未简化
public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        //先考虑边界情况,返回值最左边:0;最右边:n;
        //一、最左边边界情况:返回值为0 {1, 3, 5, 6},0
        if (target <= nums[0])
            return 0;
        //二、最右边边界情况:返回值为0 {1, 3, 5, 6},7
        if (target > nums[n - 1])
            return n;
        //三、后考虑普遍情况,返回值1 ~ n-1 {1, 3, 5, 6},5
        for (int i = 1; i < n; i++)
            if (target > nums[i - 1] && target <= nums[i])
                return i;
        return -1;
    }

简化代码

//简化的代码
    public int searchInsert(int[] nums, int target) {
        //将最左边边界情况和普遍情况合并
        for (int i = 0; i < nums.length; i++)
            if (target <= nums[i])
                return i;
        return nums.length;  //返回的是最右边边界情况
    }

复杂度分析

  • 时间复杂度:O(n),其中 n 为数组的长度。

  • 空间复杂度:O(1)。我们只需要常数空间存放若干变量。

方法二:二分法

代码

public class SearchInsertPosition2 {
    public static void main(String[] args) {
        int[] a = {1, 3, 5, 6};
        System.out.println(new SearchInsertPosition2().searchInsert(a, 5));
        System.out.println(new SearchInsertPosition2().searchInsert(a, 1));
        System.out.println(new SearchInsertPosition2().searchInsert(a, 7));
    }

    public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        int left = 0;
        int right = n - 1;
        int ans = n; //ans 初值设置为数组长度可以省略边界条件的判断,因为存在一种情况是 target 大于数组中的所有数,此时需要插入到数组长度的位置。
        while (left <= right) {
            int middle = (left + right) / 2;
            if (target <= nums[middle]) {
                ans = middle;
                right = middle - 1;
            } else {
                left = middle + 1;
            }
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(logn),其中 n 为数组的长度。二分查找所需的时间复杂度为 O(logn)。

  • 空间复杂度:O(1)。我们只需要常数空间存放若干变量。

建议大家去看力扣官方讲解
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/search-insert-position/solution/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服