Java算法每日一题——搜索插入位置

文章目录

  • 二.搜索插入位置
    • [2.1 需求描述](#2.1 需求描述)
    • [2.2 代码实现](#2.2 代码实现)
      • [2.2.1 解法一](#2.2.1 解法一)
      • [2.2.2 解法二](#2.2.2 解法二)

二.搜索插入位置

2.1 需求描述

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

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

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

示例 2:

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

示例 3:

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

2.2 代码实现

2.2.1 解法一

java 复制代码
public class Test35 {
    public static void main(String[] args) {
        int[] nums ={1,3,5,6};
         int target =5;
        int i = searchInsert(nums, target);
        System.out.println(i);//2

 
    }
    // 第一种解法;二分查找法基础本
    public static int searchInsert(int[] nums, int target) {
        int start = 0;
        int end = nums.length-1;
        while (start <= end){
            int mid = (start + end) >>> 1;
            if(target < nums[mid]){
                end = mid - 1;
            }else if (nums[mid] < target){
                start = mid + 1;
            }else {
                return mid;
            }
        }
        return start;
    }

}

2.2.2 解法二

java 复制代码
public class Test35 {
    public static void main(String[] args) {
      
        int[] nums ={1,3,5,6};
        int target =5;
        
        int i1 = binarySearchLeftmost(nums, target);
        System.out.println(i1);

    }
 
    // 第二种解法:二分查找法leftmost
    public static int binarySearchLeftmost(int[] arr, int target){
        // 起始索引
        int start = 0;
        // 末尾索引
        int end = arr.length-1;

        // start索引和end索范围内有东西执行查找
        while (start <= end){
            // 定义中间索引
            int mid = (start +end)>>>1;
            // 目标函数 小于 中间值
            if (target <= arr[mid] ){
                end = mid - 1;
            }else {
                start = mid + 1;
            }
        }
        //循环结束,假如找到在数组中找到目标值则返回最左边的查找目标值索引
        //如果没有找到返回的是目标值要插入的位置。
        //总的来说返回的是 >= target的最靠左索引
        return start;
    }
    // BinarySearch()  结束
}
相关推荐
Dizzy.51721 分钟前
数据结构(查找)
数据结构·学习·算法
软件开发技术局43 分钟前
撕碎QT面具(8):对控件采用自动增加函数(转到槽)的方式,发现函数不能被调用的解决方案
开发语言·qt
周杰伦fans2 小时前
C#中修饰符
开发语言·c#
yngsqq2 小时前
c# —— StringBuilder 类
java·开发语言
赔罪3 小时前
Python 高级特性-切片
开发语言·python
星星点点洲3 小时前
【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致
java·mysql
xiaolingting3 小时前
JVM层面的JAVA类和实例(Klass-OOP)
java·jvm·oop·klass·instanceklass·class对象
分别努力读书3 小时前
acm培训 part 7
算法·图论
武乐乐~3 小时前
欢乐力扣:赎金信
算法·leetcode·职场和发展
Jared_devin3 小时前
数据结构——模拟栈例题B3619
数据结构