【算法】二分查找(二)查找边界二分

【算法】二分查找(二)查找边界二分

目录

题目介绍

二段性

1.二段搜索

1.1搜索段端点

1.1.1住段的左端点

1.1.2住段的右端点

2.死循环

2.1中点偏向

2.2多余搜索

3.模板

3.1求段左端点:​编辑

3.2求段右端点:​编辑

4.区别

提交代码


题目介绍

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

给你一个按照非递减顺序排列的整数数组 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

二段性

区域 可划分成 两段性质部分





1.二段搜索

两指针 在各段部分内 中点算 半缩排区域 地 跃段住段 往界点搜索1.1搜索段端点

跃指针住指针相遇时 算排出 住段部分的端点1.1.1住段的左端点

1.1.2住段的右端点

2.死循环

中点 下次立到 在住段部分的 住指针时,住指针的移动 去原地踏步后,再下次的中点也还不变 继续立住指针 去原地踏步,进入死循环2.1中点偏向left + (right - left) / 2偏左中点left + (right - left + 1) / 2偏右中点

中点 不能 偏向 住段侧 立,否则 最后中点会立到住指针 而进入死循环2.2多余搜索

跃指针与住指针相遇 算排得到结果后 就可停止搜索了,如果此时继续去搜索,left == right的中点 会立到住指针 而进入 原地踏步死循环除非里面增加一个 left == right时 判断nums[left]等不等于target  已找到边界或找不到边界 而return退出,否则left <= right 条件退不出来的3.模板

while(left < right) {

      int mid = left + (right - left) / 2; —> 立 偏左中点

      if(mid落左跃段) left = mid + 1;

      else right = mid; —> mid落右住段

}



while(left < right) {

      int mid = left + (right - left + 1) / 2; —> 立 偏右中点

      if(mid落左住段) left = mid;

      else right = mid - 1; —> mid落右跃段

}

最上面 + 1,最下面 - 1)4.区别

朴素二分找值所在位置∈边界二分找值范围边界可以通过 找此一个值的边界位置 来找到此值

3.2求段端点:

3.1求段端点:


提交代码

public int[] searchRange(int[] nums, int target) { int[] ret = new int[2]; ret[0] = ret[1] = -1; if(nums.length == 0) return ret; // 查找段端点,住段的左端点: [<3] [这里|>=3] (左对应>=) int left = 0, right = nums.length - 1; while(left < right) { // 不能去多余搜索 left == right时的情况,否则会 中点立到住指针 进入死循环 int mid = left + (right - left) / 2; // 中点要偏向跃段部分 即偏左 if(nums[mid] < target) left = mid + 1; // mid落左跃段 else right = mid; // mid落右住段 } if(nums[left] != target) return ret; else ret[0] = left; // 查找段端点,住段的右端点: [<=3|这里] [>3] (右对应<=) // left = 0; // 接下来左指针 可以直接从找到的左端点处开始 对剩下的右半部分 进行二分 查找右端点 right = nums.length - 1; while(left < right) { int mid = left + (right - left + 1) / 2; // 中点不能偏向住段部分 即偏右 // 上面有+1 if(nums[mid] <= target) left = mid; // mid落左住段 else right = mid - 1; // mid落右跃段 // 下面有-1 } ret[1] = left; return ret; }

Read more

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务并全面实现无损语言壁垒交互 前言 在 OpenHarmony 应用向高性能计算领域扩展的过程中,如何优雅地接入已有的 C/C++ 算法库(如加密引擎、重型图像处理、数学模拟)而又不失跨平台的便捷性?传统的 NAPI 虽然稳健,但在 Flutter 生态中,直接利用 WebAssembly (WASM) 配合 FFI(External Function Interface)的语义可以在一定程度上实现代码的高度复用。wasm_ffi 库为 Flutter 开发者提供了一套在 Dart 环境下调用 WASM

By Ne0inhk
三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

文章目录 * **第一部分:引言与核心密码学概念** * **1.1 为什么IM需要端到端加密(E2EE)?** * **1.2 核心密码学概念与工具** * **第二部分:方案一:静态非对称加密(基础方案)** * **2.1 方案概述与流程** * **2.2 前端Vue实现(使用node-forge)** * **1. 安装依赖** * **2. 核心工具类 `crypto.js`** * **3. Vue组件中使用** * **2.3 后端Java实现(Spring Boot)** * **1. 实体类** * **2. Controller层** * **3. WebSocket配置** * **2.4 密钥管理、注册与登录集成** * **1. 用户注册/登录时生成密钥** * **2. 密钥设置页面** * **2.

By Ne0inhk
前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

在 AI 辅助编程领域,长期以来似乎存在一条不成文的铁律:如果你想要最好的结果,就必须为最昂贵的模型买单(通常是 Anthropic 或 OpenAI 的旗舰模型)。然而,随着国产大模型如 GLM 4.7 和 MiniMax M2.1 的迭代,这一格局正在发生剧烈震荡。 最近,一场针对Claude Opus 4.5、Gemini 3 Pro、GLM 4.7 和 MiniMax M2.1 的前端 UI生成横向测评,打破了许多人的固有认知。在这场包含落地页、仪表盘、移动端应用等五个真实场景的较量中,不仅出现了令人咋舌的“滑铁卢”,更诞生了性价比极高的“新王”。 本文将深入拆解这场测试的细节,透过代码生成的表象,探讨大模型在工程化落地中的真实效能与成本逻辑。

By Ne0inhk
【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * JavaScript 正则表达式详解 * 什么是正则表达式🤔 * JavaScript 正则表达式的定义与使用🥝 * 1. 字面量语法 * 2. 常用匹配方法 * test() 方法🍋‍🟩 * exec() 方法🍋‍🟩 * 正则表达式的核心组成部分🐦‍🔥 * 1. 元字符 * 边界符 * 量词 * 字符类 * 2. 修饰符 * 简单示例🍂 JavaScript 正则表达式详解 正则表达式是处理字符串的强大工具,在 JavaScript 中被广泛应用于表单验证、文本处理和数据提取等场景。本文将从正则表达式的基本概念出发,详细介绍其语法规则和实际应用方法。 什么是正则表达式🤔 正则表达式是用于匹配字符串中字符组合的模式,在 JavaScript

By Ne0inhk