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()  结束
}
相关推荐
圣保罗的大教堂2 小时前
leetcode 3867. 数对的最大公约数之和 中等
leetcode
To_OC4 小时前
LC 15 三数之和:双指针不难,难的是把去重做对
javascript·算法·leetcode
benchmark_cc6 小时前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?
开发语言·人工智能·python·pandas·量化交易·quantdash
阿维的博客日记6 小时前
MultipartFile 是不是表示仅仅是一个分片?
java·后端·spring·multipartfile
renhongxia17 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
程序员无隅7 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
Python+997 小时前
Java 枚举类(Enum)详解:从基础到高级应用
java·开发语言·python
G.O.G.O.G7 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)
数据库·sql·mysql·leetcode
二炮手亮子7 小时前
浅记java线程池
java·开发语言
一路向北North7 小时前
Spring Security OAuth2.0(23):分布式系统授权-转发明文给微服务
java·spring·微服务