当前位置: 首页 > article >正文

LeetCode二分查找

搜索插入位置

description

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

请必须使用时间复杂度为 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

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104

idea

算法真是优雅的艺术~虽然我还很粗糙!
搜索指定数据位置,找不到则返回需要插入的位置。
因为加了小小的变动:找不到返回应该插入的位置。已知数组升序,我们可以把问题转换为找到首个大于等于target的位置

solution

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length - 1, ans = nums.length;
        while(left <= right){
            int mid = (left + right) / 2;
            if(target > nums[mid]) left = mid + 1;
            else{
                ans = mid;
                right = mid - 1;
            } 
        }
        return ans;
    }
}

在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109

idea

类似上一题,升序数组中查找元素,联想到用二分查找。
需要找元素首次出现和最后一次出现的位置,可以把基本的二分查找转化为找最左(右)出现的位置。

solution

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] ans =   {getPos(nums, target, 0), getPos(nums, target, 1)};
        return ans;
    }
    public int getPos(int[] nums, int target, int flag){
        int left = 0, right = nums.length - 1, ans = -1;
        while(left <= right){
            int mid = (left + right) / 2;
            if(nums[mid] == target){
                ans = mid;
                if(flag == 0) right = mid - 1;
                else left = mid + 1;
            }
            else if(nums[mid] > target) right = mid - 1;
            else left = mid + 1;
        }
        return ans;
    }
}

http://www.kler.cn/a/106095.html

相关文章:

  • Ubuntu 22.04.4 LTS + certbot 做自动续签SSL证书(2024-11-14亲测)
  • el-table中增加校验方法(二)
  • 【C#】C#编程基础:探索控制台应用与数据操作
  • hive中map_concat函数介绍
  • HBase压测 ycsb
  • 微服务链路追踪skywalking安装
  • 如何为你的地图数据设置地图样式?
  • 华为---DHCP中继代理简介及示例配置
  • Databend 开源周报第 116 期
  • springcloud笔记 (8) -网关 Gateway
  • 结构伪类选择器
  • 小红书素人铺量推广费用是多少?
  • Netty进阶-黏包半包
  • 达芬奇MacOS最新中文版 DaVinci Resolve Studio 18中文注册秘钥
  • Go并发:使用sync.Pool来性能优化
  • Python深度学习实战-基于tensorflow.keras六步法搭建神经网络(附源码和实现效果)
  • 聊聊springboot的TomcatMetricsBinder
  • 什么是React中的高阶组件(Higher Order Component,HOC)?它的作用是什么?
  • 【EI会议征稿】2024年电力电子与人工智能国际学术会议(PEAI 2024)
  • 大数据-Storm流式框架(二)--wordcount案例
  • 在项目中同时使用SpringCloud和Dubbo,注册中心选用Eureka?
  • TeeChart for .NET 2023.10.19 Crack
  • 缓解光纤激光切割机老化之如何保养光纤激光切割机的光学镜片
  • ES SearchAPI----Query DSL语言
  • HugeGraph Hubble 配置 https 协议的操作步骤
  • iOS安全加固方法及实现