• LeetCode刷题-- 搜索插入位置


    一、题目

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

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

    示例 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. 插入的元素比第一个元素还小,直接返回0
    2. 插入的元素最大,直接返回nums.length
    3. 插入的元素在数组中存在,返回该返回的下标
    4. 插入的元素在数组中不存在,找到第一个比target大的数,该数的位置就是应该插入的位置。
      解题有两种思路: 第一种暴力破解法、第二种二分查找法

    三、代码

    public class _01_搜索插入位置 {
    
        // 1. 暴力法解决: 时间复杂度: O(n)   空间复杂度: O(1)         0ms,33.76MB
        public static int searchInsert(int[] nums, int target) {
            for(int i=0; i<nums.length; i++){
                if(target <= nums[i]){
                    return i;
                }
            }
            return  nums.length;
        }
        
        // 2.  二分法解决
        public static int searchInsert2(int[] nums, int target) {
             int left = 0, right = nums.length-1;                 // target在左闭右闭的区间里
             while(left <= right){                       // 当left=right时,区间[left,right]仍然有效。
                 int mid = left + (right - left)/2;     // 等同于 int mid = (left + right)/2;
                 if(nums[mid] == target)
                     return mid;                         // 二分法查找到了target,对应第三种情况
                 else if(nums[mid] < target){
                     left = mid + 1;
                 }else if(nums[mid] > target){
                     right = mid -1;
                 }
             }
          
             if(target < nums[0])       // 第1种情况
                 return 0;
             return right +1;          //  此处用right加1可以涵盖第2和第4种情况 
        }
    
        public static void main(String[] args) {
            int [] nums = {1,2,3,5,6};
            int target = 7;
            System.out.println(searchInsert(nums,target) );
            System.out.println(searchInsert2(nums,target) );
        }
    }
    

    四、时间负载度和空间复杂度

    暴力法: 时间复杂度O(n) ,空间复杂度O(1)

    二分查找法:时间复杂度O(logn) ,空间复杂度O(1)

  • 相关阅读:
    input 去除边框
    分页封装
    python后端继承序列化,不同访问形式返回不同结果
    解决vue前端不显示自定义字段
    Vue 获取后端多对多关联表信息
    vue 前段增删改查代码规范
    前段增删改查的应用
    ant-design-vue基础
    python 后端 数据库的创表及增删改查 简单使用
    配置Uwsgi+Nginx+Django+Vue
  • 原文地址:https://www.cnblogs.com/sinlearn/p/14678727.html
Copyright © 2020-2023  润新知