From f0826da7f66ffd80119b4edf1fb910722619c96d Mon Sep 17 00:00:00 2001 From: krahets Date: Mon, 14 Aug 2023 23:32:25 +0800 Subject: [PATCH] build --- chapter_appendix/installation.md | 3 +- chapter_searching/binary_search.md | 16 ++++----- chapter_searching/binary_search_edge.md | 26 +++++++++++++-- chapter_searching/binary_search_insertion.md | 34 ++++++++++++++++++-- 4 files changed, 66 insertions(+), 13 deletions(-) diff --git a/chapter_appendix/installation.md b/chapter_appendix/installation.md index 30328476e..d64477ea0 100644 --- a/chapter_appendix/installation.md +++ b/chapter_appendix/installation.md @@ -40,7 +40,8 @@ comments: true ## 16.1.7.   C# 环境 1. 下载并安装 [.Net 6.0](https://dotnet.microsoft.com/en-us/download) 。 -2. 在 VSCode 的插件市场中搜索 `c#` ,安装 c# 。 +2. 在 VSCode 的插件市场中搜索 `C# Dev Kit` ,安装 C# Dev Kit ([配置教程](https://code.visualstudio.com/docs/csharp/get-started))。 +3. 也可使用 Visual Studio([安装教程](https://learn.microsoft.com/zh-cn/visualstudio/install/install-visual-studio?view=vs-2022))。 ## 16.1.8.   Swift 环境 diff --git a/chapter_searching/binary_search.md b/chapter_searching/binary_search.md index afdcf67d6..39fbc2507 100755 --- a/chapter_searching/binary_search.md +++ b/chapter_searching/binary_search.md @@ -313,16 +313,16 @@ comments: true fn binary_search(nums: &[i32], target: i32) -> i32 { // 初始化双闭区间 [0, n-1] ,即 i, j 分别指向数组首元素、尾元素 let mut i = 0; - let mut j = nums.len() - 1; + let mut j = nums.len() as i32 - 1; // 循环,当搜索区间为空时跳出(当 i > j 时为空) while i <= j { let m = i + (j - i) / 2; // 计算中点索引 m - if nums[m] < target { // 此情况说明 target 在区间 [m+1, j] 中 + if nums[m as usize] < target { // 此情况说明 target 在区间 [m+1, j] 中 i = m + 1; - } else if nums[m] > target { // 此情况说明 target 在区间 [i, m-1] 中 + } else if nums[m as usize] > target { // 此情况说明 target 在区间 [i, m-1] 中 j = m - 1; } else { // 找到目标元素,返回其索引 - return m as i32; + return m; } } // 未找到目标元素,返回 -1 @@ -604,16 +604,16 @@ comments: true fn binary_search_lcro(nums: &[i32], target: i32) -> i32 { // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1 let mut i = 0; - let mut j = nums.len(); + let mut j = nums.len() as i32; // 循环,当搜索区间为空时跳出(当 i = j 时为空) while i < j { let m = i + (j - i) / 2; // 计算中点索引 m - if nums[m] < target { // 此情况说明 target 在区间 [m+1, j) 中 + if nums[m as usize] < target { // 此情况说明 target 在区间 [m+1, j) 中 i = m + 1; - } else if nums[m] > target { // 此情况说明 target 在区间 [i, m) 中 + } else if nums[m as usize] > target { // 此情况说明 target 在区间 [i, m) 中 j = m - 1; } else { // 找到目标元素,返回其索引 - return m as i32; + return m; } } // 未找到目标元素,返回 -1 diff --git a/chapter_searching/binary_search_edge.md b/chapter_searching/binary_search_edge.md index 379cc5a73..0d5202ca9 100644 --- a/chapter_searching/binary_search_edge.md +++ b/chapter_searching/binary_search_edge.md @@ -131,7 +131,17 @@ status: new === "Dart" ```dart title="binary_search_edge.dart" - [class]{}-[func]{binarySearchLeftEdge} + /* 二分查找最左一个 target */ + int binarySearchLeftEdge(List nums, int target) { + // 等价于查找 target 的插入点 + int i = binarySearchInsertion(nums, target); + // 未找到 target ,返回 -1 + if (i == nums.length || nums[i] != target) { + return -1; + } + // 找到 target ,返回索引 i + return i; + } ``` === "Rust" @@ -279,7 +289,19 @@ status: new === "Dart" ```dart title="binary_search_edge.dart" - [class]{}-[func]{binarySearchRightEdge} + /* 二分查找最右一个 target */ + int binarySearchRightEdge(List nums, int target) { + // 转化为查找最左一个 target + 1 + int i = binarySearchInsertion(nums, target + 1); + // j 指向最右一个 target ,i 指向首个大于 target 的元素 + int j = i - 1; + // 未找到 target ,返回 -1 + if (j == -1 || nums[j] != target) { + return -1; + } + // 找到 target ,返回索引 j + return j; + } ``` === "Rust" diff --git a/chapter_searching/binary_search_insertion.md b/chapter_searching/binary_search_insertion.md index 07d0a52ab..71fa34b9f 100644 --- a/chapter_searching/binary_search_insertion.md +++ b/chapter_searching/binary_search_insertion.md @@ -164,7 +164,22 @@ status: new === "Dart" ```dart title="binary_search_insertion.dart" - [class]{}-[func]{binarySearchInsertionSimple} + /* 二分查找插入点(无重复元素) */ + int binarySearchInsertionSimple(List nums, int target) { + int i = 0, j = nums.length - 1; // 初始化双闭区间 [0, n-1] + while (i <= j) { + int m = i + (j - i) ~/ 2; // 计算中点索引 m + if (nums[m] < target) { + i = m + 1; // target 在区间 [m+1, j] 中 + } else if (nums[m] > target) { + j = m - 1; // target 在区间 [i, m-1] 中 + } else { + return m; // 找到 target ,返回插入点 m + } + } + // 未找到 target ,返回插入点 i + return i; + } ``` === "Rust" @@ -362,7 +377,22 @@ status: new === "Dart" ```dart title="binary_search_insertion.dart" - [class]{}-[func]{binarySearchInsertion} + /* 二分查找插入点(存在重复元素) */ + int binarySearchInsertion(List nums, int target) { + int i = 0, j = nums.length - 1; // 初始化双闭区间 [0, n-1] + while (i <= j) { + int m = i + (j - i) ~/ 2; // 计算中点索引 m + if (nums[m] < target) { + i = m + 1; // target 在区间 [m+1, j] 中 + } else if (nums[m] > target) { + j = m - 1; // target 在区间 [i, m-1] 中 + } else { + j = m - 1; // 首个小于 target 的元素在区间 [i, m-1] 中 + } + } + // 返回插入点 i + return i; + } ``` === "Rust"