From e1006fa09cb8e47a187db9de306fee6a120b3c79 Mon Sep 17 00:00:00 2001 From: flowerstonezl <125468358+flowerstonezl@users.noreply.github.com> Date: Thu, 29 Jan 2026 17:04:05 +0800 Subject: [PATCH] first init --- .gitignore | 63 +++ README.md | 3 + .../27remove_target/CMakeLists.txt | 41 ++ .../27remove_target/kotlin/App.kt | 49 ++ .../27remove_target/python/27. 移除元素.ipynb | 153 ++++++ .../1binary search/27remove_target/src/27.cpp | 39 ++ .../c++/CMakeLists.txt | 49 ++ .../35search-insert-position/c++/src/main.cpp | 113 ++++ .../kotlin/Solution.kt | 93 ++++ .../python/35. 搜索插入位置.ipynb | 143 +++++ .../python/solution.py | 91 ++++ .../704Binary search/CMakeLists.txt | 110 ++++ .../704Binary search/kotlin/704.kt | 43 ++ .../704Binary search/kotlin/App.kt | 70 +++ .../python/704. 二分查找.ipynb | 134 +++++ .../704Binary search/src/704.cpp | 46 ++ .../CMakeLists.txt | 110 ++++ .../kotlin/App.kt | 49 ++ .../2311. 小于等于 K 的最长二进制子序列.ipynb | 137 +++++ .../src/704.cpp | 46 ++ .../CMakeLists.txt | 41 ++ .../kotlin/App.kt | 49 ++ .../python/594. 最长和谐子序列.ipynb | 107 ++++ .../src/27.cpp | 39 ++ .../CMakeLists.txt | 41 ++ .../kotlin/App.kt | 49 ++ .../python/3330. 找到初始输入字符串 I.ipynb | 140 +++++ .../src/27.cpp | 39 ++ .../CMakeLists copy.txt | 23 + .../CMakeLists.txt | 41 ++ .../kotlin/App.kt | 49 ++ .../python/3333. 找到初始输入字符串 II.ipynb | 157 ++++++ .../src/27.cpp | 39 ++ .../CMakeLists.txt | 41 ++ .../kotlin/App.kt | 49 ++ .../python/118. 杨辉三角.ipynb | 156 ++++++ .../20250801_118_pascals-triangle/src/27.cpp | 39 ++ .../c++/CMakeLists.txt | 48 ++ .../c++/src/main.cpp | 97 ++++ .../kotlin/Solution.kt | 92 ++++ .../python/1458. 两个子序列的最大点积.ipynb | 113 ++++ .../solution.md | 11 + .../c++/CMakeLists.txt | 30 ++ .../c++/src/main.cpp | 67 +++ .../kotlin/Solution.kt | 95 ++++ ...inimum Cost Path with Edge Reversals.ipynb | 253 +++++++++ .../c++/CMakeLists.txt | 6 + .../c++/src/main.cpp | 22 + .../kotlin/Solution.kt | 86 +++ ...inimum Cost Path with Teleportations.ipynb | 194 +++++++ flowzl/day_import.py | 493 ++++++++++++++++++ 51 files changed, 4288 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 array/1binary search/27remove_target/CMakeLists.txt create mode 100644 array/1binary search/27remove_target/kotlin/App.kt create mode 100644 array/1binary search/27remove_target/python/27. 移除元素.ipynb create mode 100644 array/1binary search/27remove_target/src/27.cpp create mode 100644 array/1binary search/35search-insert-position/c++/CMakeLists.txt create mode 100644 array/1binary search/35search-insert-position/c++/src/main.cpp create mode 100644 array/1binary search/35search-insert-position/kotlin/Solution.kt create mode 100644 array/1binary search/35search-insert-position/python/35. 搜索插入位置.ipynb create mode 100644 array/1binary search/35search-insert-position/python/solution.py create mode 100644 array/1binary search/704Binary search/CMakeLists.txt create mode 100644 array/1binary search/704Binary search/kotlin/704.kt create mode 100644 array/1binary search/704Binary search/kotlin/App.kt create mode 100644 array/1binary search/704Binary search/python/704. 二分查找.ipynb create mode 100644 array/1binary search/704Binary search/src/704.cpp create mode 100644 flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/CMakeLists.txt create mode 100644 flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/kotlin/App.kt create mode 100644 flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/python/2311. 小于等于 K 的最长二进制子序列.ipynb create mode 100644 flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/src/704.cpp create mode 100644 flowzl/day test/20250630_594_longest-harmonious/CMakeLists.txt create mode 100644 flowzl/day test/20250630_594_longest-harmonious/kotlin/App.kt create mode 100644 flowzl/day test/20250630_594_longest-harmonious/python/594. 最长和谐子序列.ipynb create mode 100644 flowzl/day test/20250630_594_longest-harmonious/src/27.cpp create mode 100644 flowzl/day test/20250701_3330_find-the-original-typed-string-i/CMakeLists.txt create mode 100644 flowzl/day test/20250701_3330_find-the-original-typed-string-i/kotlin/App.kt create mode 100644 flowzl/day test/20250701_3330_find-the-original-typed-string-i/python/3330. 找到初始输入字符串 I.ipynb create mode 100644 flowzl/day test/20250701_3330_find-the-original-typed-string-i/src/27.cpp create mode 100644 flowzl/day test/20250702_3333_find-the-original-typed-string-ii/CMakeLists copy.txt create mode 100644 flowzl/day test/20250702_3333_find-the-original-typed-string-ii/CMakeLists.txt create mode 100644 flowzl/day test/20250702_3333_find-the-original-typed-string-ii/kotlin/App.kt create mode 100644 flowzl/day test/20250702_3333_find-the-original-typed-string-ii/python/3333. 找到初始输入字符串 II.ipynb create mode 100644 flowzl/day test/20250702_3333_find-the-original-typed-string-ii/src/27.cpp create mode 100644 flowzl/day test/20250801_118_pascals-triangle/CMakeLists.txt create mode 100644 flowzl/day test/20250801_118_pascals-triangle/kotlin/App.kt create mode 100644 flowzl/day test/20250801_118_pascals-triangle/python/118. 杨辉三角.ipynb create mode 100644 flowzl/day test/20250801_118_pascals-triangle/src/27.cpp create mode 100644 flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/c++/CMakeLists.txt create mode 100644 flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/c++/src/main.cpp create mode 100644 flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/kotlin/Solution.kt create mode 100644 flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/python/1458. 两个子序列的最大点积.ipynb create mode 100644 flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/solution.md create mode 100644 flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/c++/CMakeLists.txt create mode 100644 flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/c++/src/main.cpp create mode 100644 flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/kotlin/Solution.kt create mode 100644 flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/python/3650. Minimum Cost Path with Edge Reversals.ipynb create mode 100644 flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/c++/CMakeLists.txt create mode 100644 flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/c++/src/main.cpp create mode 100644 flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/kotlin/Solution.kt create mode 100644 flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/python/3651. Minimum Cost Path with Teleportations.ipynb create mode 100644 flowzl/day_import.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b6a4f89 --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +# 忽略所有 build 文件夹和目录 +build/ +*/build/ +**/build/ +.venv/ + +# 可选:忽略所有生成文件和目录 +*.o +*.obj +*.exe +*.out +*.a +*.so +*.dll +*.lib +*.dylib +*.class +*.jar +*.war +*.ear +*.log +*.cache +*.tmp +*.DS_Store +*.swp +*.swo +*.jar + +# 可选:忽略常见 IDE 的项目文件 +.vscode/ +.idea/ +.cache/ +*.code-workspace +*.iml +*.suo +*.user + + + +gradlew +gradlew.bat +gradle.properties +gradle.build +gradle.build.gradle +gradle.build.gradle.kts +gradle.build.gradle.kts.gradle +gradle.build.gradle.kts.gradle.kts +gradle.build.gradle.kts.gradle.kts.gradle + +local.properties +read.md +settings.gradle +settings.gradle.kts +settings.gradle.kts.gradle +settings.gradle.kts.gradle.kts +settings.gradle.kts.gradle.kts.gradle + +# 可选:忽略特定平台生成的文件 + + +__pycache__/ +.vscode/ +cmake/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..4815d94 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# LeetCode 题解项目 + +本项目用于整理和分享 LeetCode 各类题目的解题思路与代码实现。内容涵盖算法、数据结构等相关知识,适合备战面试和提升编程能力。欢迎交流与补充,共同进步! \ No newline at end of file diff --git a/array/1binary search/27remove_target/CMakeLists.txt b/array/1binary search/27remove_target/CMakeLists.txt new file mode 100644 index 0000000..f6c74a0 --- /dev/null +++ b/array/1binary search/27remove_target/CMakeLists.txt @@ -0,0 +1,41 @@ +# 1. 指定CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + +# 2. 设置项目信息 +project( + 27remove_target # 项目名称 + VERSION 1.0.0 # 项目版本 + DESCRIPTION "Simple C++ Project" + LANGUAGES CXX # 支持的语言 +) + +# 设置C++标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_COMPILER "g++") +# 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 +file(GLOB_RECURSE HEADERS "include/*.h") # 头文件 + +# 8. 创建目标 +# 可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + +# 14. 自定义目标 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) +# 设置输出目录 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) + +# 配置调试信息(默认启用) +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + add_compile_options(-g3 -O0) +endif() + +# 13.2 生成版本信息 +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.hpp.in + ${CMAKE_CURRENT_BINARY_DIR}/Version.hpp +) + + + diff --git a/array/1binary search/27remove_target/kotlin/App.kt b/array/1binary search/27remove_target/kotlin/App.kt new file mode 100644 index 0000000..d09861c --- /dev/null +++ b/array/1binary search/27remove_target/kotlin/App.kt @@ -0,0 +1,49 @@ +/* + * This Kotlin source file was generated by the Gradle 'init' task. + */ +package binarySearch + +class Solution { + fun removeElement(nums: IntArray, target: Int): Int { + var fast_index :Int = 0 + var slow_index :Int = 0 + while (fast_index < nums.size) { + if (nums[fast_index] != target) { + nums[slow_index] = nums[fast_index] + slow_index++ + } + fast_index++ + } + return slow_index + + } +} + +// 测试用例 +fun main() { + val nums = intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8) + + println("请输入要剔除的数字:") + val input = readLine() + + // 验证输入有效性 + if (input.isNullOrBlank()) { + println("错误:未输入任何内容") + return + } + + val target = input.toIntOrNull() ?: run { + println("错误:请输入有效的整数") + return + } + + val solution = Solution() + val result = solution.removeElement(nums, target ) + if (result == -1){ + println("不存在$target") + } + else{ + println("删除后数组长度: $result") + } +} + diff --git a/array/1binary search/27remove_target/python/27. 移除元素.ipynb b/array/1binary search/27remove_target/python/27. 移除元素.ipynb new file mode 100644 index 0000000..3b0c291 --- /dev/null +++ b/array/1binary search/27remove_target/python/27. 移除元素.ipynb @@ -0,0 +1,153 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [27. 移除元素](https://leetcode.cn/problems/remove-element)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目描述 \n", + "\n", + "给你一个数组 `nums` 和一个值 `val`,你需要 **[原地](https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)** 移除所有数值等于 `val` 的元素。元素的顺序可能发生改变。然后返回 `nums` 中与 `val` 不同的元素的数量。\n", + "\n", + "假设 `nums` 中不等于 `val` 的元素数量为 `k`,要通过此题,您需要执行以下操作:\n", + "\n", + "- 更改 `nums` 数组,使 `nums` 的前 `k` 个元素包含不等于 `val` 的元素。`nums` 的其余元素和 `nums` 的大小并不重要。\n", + "- 返回 `k`。\n", + "\n", + "**用户评测:**\n", + "\n", + "评测机将使用以下代码测试您的解决方案:\n", + "\n", + "```txt\n", + "int[] nums = [...]; // 输入数组\n", + "int val = ...; // 要移除的值\n", + "int[] expectedNums = [...]; // 长度正确的预期答案。\n", + " // 它以不等于 val 的值排序。\n", + "\n", + "int k = removeElement(nums, val); // 调用你的实现\n", + "\n", + "assert k == expectedNums.length;\n", + "sort(nums, 0, k); // 排序 nums 的前 k 个元素\n", + "for (int i = 0; i < actualLength; i++) {\n", + " assert nums[i] == expectedNums[i];\n", + "}\n", + "```\n", + "\n", + "如果所有的断言都通过,你的解决方案将会 **通过**。\n", + "\n", + "**示例 1:**\n", + "\n", + "```txt\n", + "输入:nums = [3,2,2,3], val = 3\n", + "输出:2, nums = [2,2,_,_]\n", + "解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。\n", + "你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。\n", + "```\n", + "\n", + "**示例 2:**\n", + "\n", + "```txt\n", + "输入:nums = [0,1,2,2,3,0,4,2], val = 2\n", + "输出:5, nums = [0,1,4,0,3,_,_,_]\n", + "解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。\n", + "注意这五个元素可以任意顺序返回。\n", + "你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。\n", + "```\n", + "\n", + "**提示:**\n", + "\n", + "- `0 <= nums.length <= 100`\n", + "- `0 <= nums[i] <= 50`\n", + "- `0 <= val <= 100`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 解答" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution(object):\n", + " def removeElement(self, nums, val):\n", + " \"\"\"\n", + " :type nums: List[int]\n", + " :type val: int\n", + " :rtype: int\n", + " \"\"\"\n", + " slow_index = 0\n", + " for fast_index in range(len(nums)):\n", + " if nums[fast_index] != val:\n", + " nums[slow_index] = nums[fast_index]\n", + " slow_index += 1\n", + " return slow_index, nums[:slow_index]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ac31a7c1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "原始数组: 3223\n", + "原始数组长度: 4\n", + "剔除3后数组: (2, [2, 2])\n" + ] + } + ], + "source": [ + "solution = Solution()\n", + "nums = [3,2,2,3]\n", + "val = 3\n", + "print('原始数组:',''.join(map(str, nums)))\n", + "print('原始数组长度:', len(nums))\n", + "print('剔除3后数组:', solution.removeElement(nums, val)) # Output: 2" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 5, + "nbformat_minor": 10 +} diff --git a/array/1binary search/27remove_target/src/27.cpp b/array/1binary search/27remove_target/src/27.cpp new file mode 100644 index 0000000..9325db1 --- /dev/null +++ b/array/1binary search/27remove_target/src/27.cpp @@ -0,0 +1,39 @@ +#include +#include +using namespace std; + +class Solution { +public: + int removeElement(vector& nums, int val) { + + int count = nums.size(); + for (int i = 0; i < count; i++) + { + if (nums[i] != val) + { + nums[slow_index] = nums[i]; + slow_index++; + } + } + return slow_index; + + } +private: + + int slow_index = 0; +}; + +int main() +{ + vector nums = {0, 1, 2, 2, 3, 0, 4, 2}; + int val = 2; + Solution solution; + int result = solution.removeElement(nums, val); + cout << "The length of nums after removing val is: " << result << endl; + for (int i = 0; i < result; i++) + { + cout << nums[i] << " "; + } + system("pause"); + return 0; +} \ No newline at end of file diff --git a/array/1binary search/35search-insert-position/c++/CMakeLists.txt b/array/1binary search/35search-insert-position/c++/CMakeLists.txt new file mode 100644 index 0000000..8feb1b6 --- /dev/null +++ b/array/1binary search/35search-insert-position/c++/CMakeLists.txt @@ -0,0 +1,49 @@ +# 1. 指定CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + + +# 2. 设置项目信息 +project( + LeetCodeSolution # 项目名称(可根据题目修改) + VERSION 1.0.0 # 项目版本 + DESCRIPTION "LeetCode Solution Template" + LANGUAGES CXX # 支持的语言 +) + +# 3. 设置C++标准和编译特性 +set(CMAKE_CXX_STANDARD 17) # 使用C++17标准 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须支持指定标准 +set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器特有扩展 + +# 4. 配置构建类型和编译选项 +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Debug) # 默认构建类型为Debug(便于调试) +endif() + +# 公共编译选项 +add_compile_options( + "$<$:-O2>" # Release模式优化 + "$<$:-g>" # Debug模式包含调试信息 + "$<$:-O0>" # Debug模式不优化 +) + +# 平台特定选项 +if(MSVC) + add_compile_options(/W3) # MSVC: 警告等级3(刷题时不需要太严格) +else() + add_compile_options(-Wall -Wextra) # GCC/Clang: 常用警告 +endif() + +# 5. 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 + +# 6. 创建可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES}) + +# 7. 自定义目标:运行程序 +add_custom_target(run + COMMAND ${PROJECT_NAME} + DEPENDS ${PROJECT_NAME} + COMMENT "运行 ${PROJECT_NAME}..." + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) \ No newline at end of file diff --git a/array/1binary search/35search-insert-position/c++/src/main.cpp b/array/1binary search/35search-insert-position/c++/src/main.cpp new file mode 100644 index 0000000..44ecbde --- /dev/null +++ b/array/1binary search/35search-insert-position/c++/src/main.cpp @@ -0,0 +1,113 @@ +#include +#include +#include +#include + +using namespace std; + +/** + * LeetCode 解题模板 + * + * 使用方法: + * 1. 在 Solution 类中实现你的算法 + * 2. 在 main 函数中添加测试用例 + * 3. 编译运行:mkdir build && cd build && cmake .. && make && ./Solution + */ +class Solution +{ +public: + /** + * 示例函数:搜索插入位置 + * + * @param nums 排序数组 + * @param target 目标值 + * @return 目标值的索引,如果不存在则返回插入位置 + */ + int searchInsert(vector &nums, int target) + { + left = 0; + right = nums.size() - 1; + while (left < right) + { + int mid = (left + right) >> 1; + if (nums[mid] == target) + { + return mid; + } + else if (nums[mid] < target) + { + left = mid + 1; + } + else + { + right = mid; + } + } + return target<=nums[left]?left:left+1; + } + +private: + int left; + int right; +}; + +// 辅助函数:打印测试结果 +void printTestResult(const string &testName, bool passed) +{ + cout << testName << ": " << (passed ? "pass" : "fail") << endl; +} + +// 辅助函数:比较两个整数 +bool assertEquals(int actual, int expected) +{ + return actual == expected; +} + +int main() +{ + Solution solution; + + // 测试用例 1: 目标值存在于数组中 + { + vector nums = {1, 3, 5, 6}; + int target = 5; + int result = solution.searchInsert(nums, target); + int expected = 2; + cout<< "result: "< nums = {1, 3, 5, 6}; + int target = 2; + int result = solution.searchInsert(nums, target); + int expected = 1; + cout<< "result: "< nums = {1, 3, 5, 6}; + int target = 7; + int result = solution.searchInsert(nums, target); + int expected = 4; + cout<< "result: "< nums = {1, 3, 5, 6}; + int target = 0; + int result = solution.searchInsert(nums, target); + int expected = 0; + cout<< "result: "< return mid + nums[mid] < target -> left = mid + 1 + else -> right = mid - 1 + } + } + + return left + } +} + +/** + * 打印测试结果 + */ +fun printTestResult(testName: String, passed: Boolean) { + val status = if (passed) "pass" else "fail" + println("$testName: $status") +} + +/** + * 比较两个整数是否相等 + */ +fun assertEquals(actual: Int, expected: Int): Boolean { + return actual == expected +} + +fun main() { + val solution = Solution() + + // 测试用例 1: 目标值存在于数组中 + val nums1 = intArrayOf(1, 3, 5, 6) + val target1 = 5 + val result1 = solution.searchInsert(nums1, target1) + val expected1 = 2 + printTestResult("test case 1:target exists $target1", assertEquals(result1, expected1)) + + // 测试用例 2: 目标值不存在,应插入到中间位置 + val nums2 = intArrayOf(1, 3, 5, 6) + val target2 = 2 + val result2 = solution.searchInsert(nums2, target2) + val expected2 = 1 + printTestResult("test case 2:insert in middle $target2", assertEquals(result2, expected2)) + + // 测试用例 3: 目标值大于所有元素 + val nums3 = intArrayOf(1, 3, 5, 6) + val target3 = 7 + val result3 = solution.searchInsert(nums3, target3) + val expected3 = 4 + printTestResult("test case 3:insert at end $target3", assertEquals(result3, expected3)) + + // 测试用例 4: 目标值小于所有元素 + + val nums4 = intArrayOf(1, 3, 5, 6) + val target4 = 0 + val result4 = solution.searchInsert(nums4, target4) + val expected4 = 0 + printTestResult("test case 4:insert at start $target4", assertEquals(result4, expected4)) + + println("\n all test cases passed!") +} + diff --git a/array/1binary search/35search-insert-position/python/35. 搜索插入位置.ipynb b/array/1binary search/35search-insert-position/python/35. 搜索插入位置.ipynb new file mode 100644 index 0000000..4e2cfc4 --- /dev/null +++ b/array/1binary search/35search-insert-position/python/35. 搜索插入位置.ipynb @@ -0,0 +1,143 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [35. 搜索插入位置](https://leetcode.cn/problems/search-insert-position)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目描述\n", + "\n", + " 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。\n", + "\n", + "请必须使用时间复杂度为 `O(log n)` 的算法。\n", + "\n", + "**示例 1:**\n", + "\n", + "```txt\n", + "输入: nums = [1,3,5,6], target = 5\n", + "输出: 2\n", + "```\n", + "\n", + "**示例 2:**\n", + "\n", + "```txt\n", + "输入: nums = [1,3,5,6], target = 2\n", + "输出: 1\n", + "```\n", + "\n", + "**示例 3:**\n", + "\n", + "```txt\n", + "输入: nums = [1,3,5,6], target = 7\n", + "输出: 4\n", + "```\n", + "\n", + "**提示:**\n", + "\n", + "- `1 <= nums.length <= 10^4`\n", + "- `-10^4 <= nums[i] <= 10^4`\n", + "- `nums` 为 **无重复元素** 的 **升序** 排列数组\n", + "- `-10^4 <= target <= 10^4`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 解答\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution(object):\n", + " def searchInsert(self, nums, target):\n", + " \"\"\"\n", + " :type nums: List[int]\n", + " :type target: int\n", + " :rtype: int\n", + " \"\"\"\n", + " left, right = 0, len(nums) - 1\n", + " while left < right:\n", + " mid = (left + right) // 2\n", + " if target > nums[mid]:\n", + " left = mid + 1\n", + " elif target < nums[mid]:\n", + " right = mid\n", + " else:\n", + " return mid \n", + " return left if nums[left] >= target else left + 1 # 注意这里的返回值 注意溢出" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "a1e23e83", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" + ] + } + ], + "source": [ + "test_nums = [1,3,5,6]\n", + "test_target = 7\n", + "solution_1 = Solution()\n", + "result_1 = solution_1.searchInsert(test_nums, test_target)\n", + "print(result_1) # 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92764a56", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 5, + "nbformat_minor": 10 +} diff --git a/array/1binary search/35search-insert-position/python/solution.py b/array/1binary search/35search-insert-position/python/solution.py new file mode 100644 index 0000000..b9ca926 --- /dev/null +++ b/array/1binary search/35search-insert-position/python/solution.py @@ -0,0 +1,91 @@ +""" +LeetCode 解题模板 + +使用方法: +1. 在 Solution 类中实现你的算法 +2. 在 if __name__ == "__main__" 中添加测试用例 +3. 运行:python solution.py +""" + +from typing import List + + +class Solution: + """ + 示例:搜索插入位置 + + 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。 + 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 + + 请必须使用时间复杂度为 O(log n) 的算法。 + """ + + def searchInsert(self, nums: List[int], target: int) -> int: + """ + 搜索插入位置 + + Args: + nums: 排序数组 + target: 目标值 + + Returns: + 目标值的索引,如果不存在则返回插入位置 + """ + left, right = 0, len(nums) - 1 + + while left <= right: + mid = left + (right - left) // 2 + if nums[mid] == target: + return mid + elif nums[mid] < target: + left = mid + 1 + else: + right = mid - 1 + + return left + + +def print_test_result(test_name: str, passed: bool): + """打印测试结果""" + status = "✓ 通过" if passed else "✗ 失败" + print(f"{test_name}: {status}") + + +def assert_equals(actual: int, expected: int) -> bool: + """比较两个整数是否相等""" + return actual == expected + + +if __name__ == "__main__": + solution = Solution() + + # 测试用例 1: 目标值存在于数组中 + nums1 = [1, 3, 5, 6] + target1 = 5 + result1 = solution.searchInsert(nums1, target1) + expected1 = 2 + print_test_result("测试用例 1: 目标值存在", assert_equals(result1, expected1)) + + # 测试用例 2: 目标值不存在,应插入到中间位置 + nums2 = [1, 3, 5, 6] + target2 = 2 + result2 = solution.searchInsert(nums2, target2) + expected2 = 1 + print_test_result("测试用例 2: 插入中间位置", assert_equals(result2, expected2)) + + # 测试用例 3: 目标值大于所有元素 + nums3 = [1, 3, 5, 6] + target3 = 7 + result3 = solution.searchInsert(nums3, target3) + expected3 = 4 + print_test_result("测试用例 3: 插入末尾", assert_equals(result3, expected3)) + + # 测试用例 4: 目标值小于所有元素 + nums4 = [1, 3, 5, 6] + target4 = 0 + result4 = solution.searchInsert(nums4, target4) + expected4 = 0 + print_test_result("测试用例 4: 插入开头", assert_equals(result4, expected4)) + + print("\n所有测试完成!") + diff --git a/array/1binary search/704Binary search/CMakeLists.txt b/array/1binary search/704Binary search/CMakeLists.txt new file mode 100644 index 0000000..facd771 --- /dev/null +++ b/array/1binary search/704Binary search/CMakeLists.txt @@ -0,0 +1,110 @@ +# 1. 指定CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + +# 2. 设置项目信息 +project( + 704BinarySearch # 项目名称 + VERSION 1.0.0 # 项目版本 + DESCRIPTION "Simple C++ Project" + LANGUAGES CXX # 支持的语言 +) + +# 3. 设置C++标准和编译特性 +set(CMAKE_CXX_STANDARD 17) # 使用C++17标准 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须支持指定标准 +set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器特有扩展 + +# 4. 配置构建类型和编译选项 +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) # 默认构建类型为Release +endif() + +# 公共编译选项 +# 修改后 - 分开添加选项 +add_compile_options( + "$<$:-O3>" # Release模式优化 + "$<$:-g3>" + "$<$:-O0>" +) + +# 平台特定选项 +if(MSVC) + add_compile_options(/W4 /WX) # MSVC: 警告等级4,视警告为错误 +else() + add_compile_options(-Wall -Wextra -Wpedantic -Werror) # GCC/Clang: 严格警告 +endif() + +# 5. 查找依赖包 +# find_package(Boost 1.70 COMPONENTS filesystem system) + +# 6. 包含目录设置 +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/include # 项目头文件目录 +) + +# 7. 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 +file(GLOB_RECURSE HEADERS "include/*.h") # 头文件 + +# 8. 创建目标 +# 可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + +# 9. 链接依赖库 +if(Boost_FOUND) + target_link_libraries(${PROJECT_NAME} + PRIVATE + Boost::filesystem + Boost::system + ) +endif() + +# 10. 安装规则 +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib +) + +install(DIRECTORY include/ DESTINATION include) + +# 11. 测试支持 +enable_testing() + +# 12. 附加功能 +# 12.1 Windows资源文件 +if(WIN32 AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/app.rc) + target_sources(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/app.rc) +endif() + +# # 12.2 预编译头文件 +# target_precompile_headers(${PROJECT_NAME} PRIVATE +# +# +# +# ${PROJECT_SOURCE_DIR}/include/pch.h +# ) + +# 13. 生成配置文件 +# 13.1 导出头文件路径 +target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ +) + +# 13.2 生成版本信息 +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.hpp.in + ${CMAKE_CURRENT_BINARY_DIR}/Version.hpp +) + +# 14. 自定义目标 +add_custom_target(run + COMMAND ${PROJECT_NAME} + DEPENDS ${PROJECT_NAME} + COMMENT "Running ${PROJECT_NAME}..." +) + +# 15. 包管理器集成 +include(CPack) \ No newline at end of file diff --git a/array/1binary search/704Binary search/kotlin/704.kt b/array/1binary search/704Binary search/kotlin/704.kt new file mode 100644 index 0000000..e866bb7 --- /dev/null +++ b/array/1binary search/704Binary search/kotlin/704.kt @@ -0,0 +1,43 @@ + +// (版本二)左闭右闭区间 +class Solution { + fun search(nums: IntArray, target: Int): Int { + var left = 0 + var right = nums.size - 1 // [left,right] 右侧为闭区间,right 设置为 nums.size - 1 + while (left <= right) { + val mid = (left + right) / 2 + if (nums[mid] < target) left = mid + 1 + else if (nums[mid] > target) right = mid - 1 // 代码的核心,循环中 right 是闭区间,这里也应是闭区间 + else return mid + } + return -1 // 没有找到 target ,返回 -1 + } +} + +class Solution_2 { + + fun search(nums: IntArray, target: Int): Int { + var left = 0 + var right = nums.size // [left,right) 右侧为开区间, + while (left < right) { + val mid = (left + right) / 2 + if (nums[mid] < target) left = mid + 1 + else if (nums[mid] > target) right = mid // 代码的核心,循环中 right 是开区间,这里应是开区间 + else return mid + } + return -1 // 没有找到 target ,返回 -1 + } +} + +// 测试用例 +fun main() { + val nums = intArrayOf( 0, 1, 2, 4, 5, 6, 7) + val target = 0 + val solution = Solution() + val result = solution.search(nums, target) + val solution2 = Solution_2() + val result2 = solution2.search(nums, target) + println("Solution 1: $result") // 0 + println("Solution 2: $result2") // 0 + +} \ No newline at end of file diff --git a/array/1binary search/704Binary search/kotlin/App.kt b/array/1binary search/704Binary search/kotlin/App.kt new file mode 100644 index 0000000..996154f --- /dev/null +++ b/array/1binary search/704Binary search/kotlin/App.kt @@ -0,0 +1,70 @@ +/* + * This Kotlin source file was generated by the Gradle 'init' task. + */ +package binarySearch + +class Solution { + fun search(nums: IntArray, target: Int): Int { + var left = 0 + var right = nums.size - 1 // [left,right] 右侧为闭区间,right 设置为 nums.size - 1 + while (left <= right) { + val mid = (left + right) / 2 + if (nums[mid] < target) left = mid + 1 + else if (nums[mid] > target) right = mid - 1 // 代码的核心,循环中 right 是闭区间,这里也应是闭区间 + else return mid + } + return -1 // 没有找到 target ,返回 -1 + } +} + +// 测试用例 +fun main() { + val nums = intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8) + + println("请输入要查找的数字:") + val input = readLine() + + // 验证输入有效性 + if (input.isNullOrBlank()) { + println("错误:未输入任何内容") + return + } + + val target = input.toIntOrNull() ?: run { + println("错误:请输入有效的整数") + return + } + + val solution = Solution() + val result = solution.search(nums, target) + if (result == -1){ + println("不存在$target") + } + else{ + println("目标索引位置: $result") + } +} + +// fun main() { +// val nums = intArrayOf(4, 5, 6, 7, 0, 1, 2) +// val reader = System.`in`.bufferedReader() + +// print("请输入要查找的数字: ") +// System.out.flush() + +// val input = reader.readLine() + +// if (input.isNullOrBlank()) { +// println("错误:未输入任何内容") +// return +// } + +// val target = input.toIntOrNull() ?: run { +// println("错误:请输入有效的整数") +// return +// } + +// val solution = Solution() +// val result = solution.search(nums, target) +// println("目标索引位置: $result") +// } \ No newline at end of file diff --git a/array/1binary search/704Binary search/python/704. 二分查找.ipynb b/array/1binary search/704Binary search/python/704. 二分查找.ipynb new file mode 100644 index 0000000..f9a72c0 --- /dev/null +++ b/array/1binary search/704Binary search/python/704. 二分查找.ipynb @@ -0,0 +1,134 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [704. 二分查找](https://leetcode.cn/problems/binary-search)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目描述 \n", + "\n", + "给定一个 `n` 个元素有序的(升序)整型数组 `nums` 和一个目标值 `target`  ,写一个函数搜索 `nums` 中的 `target`,如果 `target` 存在返回下标,否则返回 `-1`。\n", + "\n", + "你必须编写一个具有 `O(log n)` 时间复杂度的算法。\n", + "\n", + " \n", + "**示例 1:**\n", + "\n", + "```txt\n", + "输入: nums = [-1,0,3,5,9,12], target = 9\n", + "输出: 4\n", + "解释: 9 出现在 nums 中并且下标为 4\n", + "```\n", + "\n", + "**示例 2:**\n", + "\n", + "```txt\n", + "输入: nums = [-1,0,3,5,9,12], target = 2\n", + "输出: -1\n", + "解释: 2 不存在 nums 中因此返回 -1\n", + "```\n", + "\n", + "**提示:**\n", + "\n", + "1. 你可以假设 `nums` 中的所有元素是不重复的。\n", + "2. `n` 将在 `[1, 10000]`之间。\n", + "3. `nums` 的每个元素都将在 `[-9999, 9999]`之间。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 解答" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution(object):\n", + " def search(self, nums, target):\n", + " \"\"\"\n", + " :type nums: List[int]\n", + " :type target: int\n", + " :rtype: int\n", + " \"\"\"\n", + " left_location, right_location = 0, len(nums) - 1\n", + " while left_location <= right_location:\n", + " mid_location = (left_location + right_location) // 2\n", + " if nums[mid_location] == target:\n", + " return mid_location\n", + " elif nums[mid_location] < target:\n", + " left_location = mid_location + 1\n", + " else:\n", + " right_location = mid_location - 1\n", + " return -1\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "6154c8b4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" + ] + } + ], + "source": [ + "Solution=Solution().search([5, 6, 7, 8, 9, 10], 6) # Example usage\n", + "print(Solution) # Output: 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6aca97d4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 5, + "nbformat_minor": 10 +} diff --git a/array/1binary search/704Binary search/src/704.cpp b/array/1binary search/704Binary search/src/704.cpp new file mode 100644 index 0000000..a4d7238 --- /dev/null +++ b/array/1binary search/704Binary search/src/704.cpp @@ -0,0 +1,46 @@ +#include +#include +using namespace std; + +class Solution +{ +public: + int search(vector &nums, int target) + { + left_location = 0; + right_location = nums.size() - 1; + + while (left_location <= right_location) + { + // mid_location = (left_location + right_location) / 2; + mid_location = (left_location + right_location) >> 1; + if (nums[mid_location] == target) + { + return mid_location; + } + else if (nums[mid_location] < target) + { + left_location = mid_location + 1; + } + else + { + right_location = mid_location - 1; + } + } + return -1; + } + +private: + int left_location, right_location, mid_location; +}; + +int main() +{ + Solution solution; + vector nums = {1, 2, 3, 4, 5}; + int target = 3; + int result = solution.search(nums, target); + cout << "The index of target in nums is: " << result << endl; + system("pause"); + return result; +} \ No newline at end of file diff --git a/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/CMakeLists.txt b/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/CMakeLists.txt new file mode 100644 index 0000000..facd771 --- /dev/null +++ b/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/CMakeLists.txt @@ -0,0 +1,110 @@ +# 1. 指定CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + +# 2. 设置项目信息 +project( + 704BinarySearch # 项目名称 + VERSION 1.0.0 # 项目版本 + DESCRIPTION "Simple C++ Project" + LANGUAGES CXX # 支持的语言 +) + +# 3. 设置C++标准和编译特性 +set(CMAKE_CXX_STANDARD 17) # 使用C++17标准 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须支持指定标准 +set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器特有扩展 + +# 4. 配置构建类型和编译选项 +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) # 默认构建类型为Release +endif() + +# 公共编译选项 +# 修改后 - 分开添加选项 +add_compile_options( + "$<$:-O3>" # Release模式优化 + "$<$:-g3>" + "$<$:-O0>" +) + +# 平台特定选项 +if(MSVC) + add_compile_options(/W4 /WX) # MSVC: 警告等级4,视警告为错误 +else() + add_compile_options(-Wall -Wextra -Wpedantic -Werror) # GCC/Clang: 严格警告 +endif() + +# 5. 查找依赖包 +# find_package(Boost 1.70 COMPONENTS filesystem system) + +# 6. 包含目录设置 +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/include # 项目头文件目录 +) + +# 7. 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 +file(GLOB_RECURSE HEADERS "include/*.h") # 头文件 + +# 8. 创建目标 +# 可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + +# 9. 链接依赖库 +if(Boost_FOUND) + target_link_libraries(${PROJECT_NAME} + PRIVATE + Boost::filesystem + Boost::system + ) +endif() + +# 10. 安装规则 +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib +) + +install(DIRECTORY include/ DESTINATION include) + +# 11. 测试支持 +enable_testing() + +# 12. 附加功能 +# 12.1 Windows资源文件 +if(WIN32 AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/app.rc) + target_sources(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/app.rc) +endif() + +# # 12.2 预编译头文件 +# target_precompile_headers(${PROJECT_NAME} PRIVATE +# +# +# +# ${PROJECT_SOURCE_DIR}/include/pch.h +# ) + +# 13. 生成配置文件 +# 13.1 导出头文件路径 +target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ +) + +# 13.2 生成版本信息 +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.hpp.in + ${CMAKE_CURRENT_BINARY_DIR}/Version.hpp +) + +# 14. 自定义目标 +add_custom_target(run + COMMAND ${PROJECT_NAME} + DEPENDS ${PROJECT_NAME} + COMMENT "Running ${PROJECT_NAME}..." +) + +# 15. 包管理器集成 +include(CPack) \ No newline at end of file diff --git a/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/kotlin/App.kt b/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/kotlin/App.kt new file mode 100644 index 0000000..d09861c --- /dev/null +++ b/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/kotlin/App.kt @@ -0,0 +1,49 @@ +/* + * This Kotlin source file was generated by the Gradle 'init' task. + */ +package binarySearch + +class Solution { + fun removeElement(nums: IntArray, target: Int): Int { + var fast_index :Int = 0 + var slow_index :Int = 0 + while (fast_index < nums.size) { + if (nums[fast_index] != target) { + nums[slow_index] = nums[fast_index] + slow_index++ + } + fast_index++ + } + return slow_index + + } +} + +// 测试用例 +fun main() { + val nums = intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8) + + println("请输入要剔除的数字:") + val input = readLine() + + // 验证输入有效性 + if (input.isNullOrBlank()) { + println("错误:未输入任何内容") + return + } + + val target = input.toIntOrNull() ?: run { + println("错误:请输入有效的整数") + return + } + + val solution = Solution() + val result = solution.removeElement(nums, target ) + if (result == -1){ + println("不存在$target") + } + else{ + println("删除后数组长度: $result") + } +} + diff --git a/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/python/2311. 小于等于 K 的最长二进制子序列.ipynb b/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/python/2311. 小于等于 K 的最长二进制子序列.ipynb new file mode 100644 index 0000000..758661c --- /dev/null +++ b/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/python/2311. 小于等于 K 的最长二进制子序列.ipynb @@ -0,0 +1,137 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [2311. 小于等于 K 的最长二进制子序列](https://leetcode.cn/problems/longest-binary-subsequence-less-than-or-equal-to-k)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目描述 \n", + "\n", + "给你一个二进制字符串 `s` 和一个正整数 `k` 。\n", + "\n", + "请你返回 `s` 的 **最长** 子序列的长度,且该子序列对应的 **二进制** 数字小于等于 `k` 。\n", + "\n", + "注意:\n", + "\n", + "- 子序列可以有 **前导 0** 。\n", + "- 空字符串视为 `0` 。\n", + "- **子序列** 是指从一个字符串中删除零个或者多个字符后,不改变顺序得到的剩余字符序列。\n", + "\n", + "**示例 1:**\n", + "\n", + "```txt\n", + "输入:s = \"1001010\", k = 5\n", + "输出:5\n", + "解释:s 中小于等于 5 的最长子序列是 \"00010\" ,对应的十进制数字是 2 。\n", + "注意 \"00100\" 和 \"00101\" 也是可行的最长子序列,十进制分别对应 4 和 5 。\n", + "最长子序列的长度为 5 ,所以返回 5 。\n", + "```\n", + "\n", + "**示例 2:**\n", + "\n", + "```txt\n", + "输入:s = \"00101001\", k = 1\n", + "输出:6\n", + "解释:\"000001\" 是 s 中小于等于 1 的最长子序列,对应的十进制数字是 1 。\n", + "最长子序列的长度为 6 ,所以返回 6 。\n", + "```\n", + "\n", + "**提示:**\n", + "\n", + "- `1 <= s.length <= 1000`\n", + "- `s[i]` 要么是 `'0'` ,要么是 `'1'` 。\n", + "- `1 <= k <= 10^9`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 解答" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution(object):\n", + " def longestSubsequence(self, s, k):\n", + " \"\"\"\n", + " :type s: str\n", + " :type k: int\n", + " :rtype: int\n", + " \"\"\"\n", + " while int(s, 2) > k:\n", + " s = s.replace('1', '', 1)\n", + " return len(s)\n", + " \n", + " \n", + " def longestSubsequence1(self, s, k):\n", + " \"\"\"\n", + " :type s: str\n", + " :type k: int\n", + " :rtype: int\n", + " \"\"\"\n", + " while int(s, 2) > k:\n", + " s = s.replace('1', '', 1)\n", + " return len(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5ca56000", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n" + ] + } + ], + "source": [ + "solution = Solution()\n", + "print(solution.longestSubsequence(\"1001010\", 5)) # Output:" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 5, + "nbformat_minor": 10 +} diff --git a/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/src/704.cpp b/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/src/704.cpp new file mode 100644 index 0000000..a4d7238 --- /dev/null +++ b/flowzl/day test/20250626_2311longest-binary-subsequence-less-than-or-equal-to-k/src/704.cpp @@ -0,0 +1,46 @@ +#include +#include +using namespace std; + +class Solution +{ +public: + int search(vector &nums, int target) + { + left_location = 0; + right_location = nums.size() - 1; + + while (left_location <= right_location) + { + // mid_location = (left_location + right_location) / 2; + mid_location = (left_location + right_location) >> 1; + if (nums[mid_location] == target) + { + return mid_location; + } + else if (nums[mid_location] < target) + { + left_location = mid_location + 1; + } + else + { + right_location = mid_location - 1; + } + } + return -1; + } + +private: + int left_location, right_location, mid_location; +}; + +int main() +{ + Solution solution; + vector nums = {1, 2, 3, 4, 5}; + int target = 3; + int result = solution.search(nums, target); + cout << "The index of target in nums is: " << result << endl; + system("pause"); + return result; +} \ No newline at end of file diff --git a/flowzl/day test/20250630_594_longest-harmonious/CMakeLists.txt b/flowzl/day test/20250630_594_longest-harmonious/CMakeLists.txt new file mode 100644 index 0000000..f6c74a0 --- /dev/null +++ b/flowzl/day test/20250630_594_longest-harmonious/CMakeLists.txt @@ -0,0 +1,41 @@ +# 1. 指定CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + +# 2. 设置项目信息 +project( + 27remove_target # 项目名称 + VERSION 1.0.0 # 项目版本 + DESCRIPTION "Simple C++ Project" + LANGUAGES CXX # 支持的语言 +) + +# 设置C++标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_COMPILER "g++") +# 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 +file(GLOB_RECURSE HEADERS "include/*.h") # 头文件 + +# 8. 创建目标 +# 可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + +# 14. 自定义目标 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) +# 设置输出目录 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) + +# 配置调试信息(默认启用) +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + add_compile_options(-g3 -O0) +endif() + +# 13.2 生成版本信息 +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.hpp.in + ${CMAKE_CURRENT_BINARY_DIR}/Version.hpp +) + + + diff --git a/flowzl/day test/20250630_594_longest-harmonious/kotlin/App.kt b/flowzl/day test/20250630_594_longest-harmonious/kotlin/App.kt new file mode 100644 index 0000000..d09861c --- /dev/null +++ b/flowzl/day test/20250630_594_longest-harmonious/kotlin/App.kt @@ -0,0 +1,49 @@ +/* + * This Kotlin source file was generated by the Gradle 'init' task. + */ +package binarySearch + +class Solution { + fun removeElement(nums: IntArray, target: Int): Int { + var fast_index :Int = 0 + var slow_index :Int = 0 + while (fast_index < nums.size) { + if (nums[fast_index] != target) { + nums[slow_index] = nums[fast_index] + slow_index++ + } + fast_index++ + } + return slow_index + + } +} + +// 测试用例 +fun main() { + val nums = intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8) + + println("请输入要剔除的数字:") + val input = readLine() + + // 验证输入有效性 + if (input.isNullOrBlank()) { + println("错误:未输入任何内容") + return + } + + val target = input.toIntOrNull() ?: run { + println("错误:请输入有效的整数") + return + } + + val solution = Solution() + val result = solution.removeElement(nums, target ) + if (result == -1){ + println("不存在$target") + } + else{ + println("删除后数组长度: $result") + } +} + diff --git a/flowzl/day test/20250630_594_longest-harmonious/python/594. 最长和谐子序列.ipynb b/flowzl/day test/20250630_594_longest-harmonious/python/594. 最长和谐子序列.ipynb new file mode 100644 index 0000000..5c79e33 --- /dev/null +++ b/flowzl/day test/20250630_594_longest-harmonious/python/594. 最长和谐子序列.ipynb @@ -0,0 +1,107 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [594. 最长和谐子序列](https://leetcode.cn/problems/longest-harmonious-subsequence)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目描述 \n", + "\n", + "和谐数组是指一个数组里元素的最大值和最小值之间的差别 **正好是 `1`** 。\n", + "\n", + "给你一个整数数组 `nums` ,请你在所有可能的 子序列 中找到最长的和谐子序列的长度。\n", + "\n", + "数组的 **子序列** 是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。\n", + "\n", + "**示例 1:**\n", + "\n", + "**输入:**nums = \\[1,3,2,2,5,2,3,7\\]\n", + "\n", + "**输出:**5\n", + "\n", + "**解释:**\n", + "\n", + "最长和谐子序列是 `[3,2,2,2,3]`。\n", + "\n", + "**示例 2:**\n", + "\n", + "**输入:**nums = \\[1,2,3,4\\]\n", + "\n", + "**输出:**2\n", + "\n", + "**解释:**\n", + "\n", + "最长和谐子序列是 `[1,2]`,`[2,3]` 和 `[3,4]`,长度都为 2。\n", + "\n", + "**示例 3:**\n", + "\n", + "**输入:**nums = \\[1,1,1,1\\]\n", + "\n", + "**输出:**0\n", + "\n", + "**解释:**\n", + "\n", + "不存在和谐子序列。\n", + "\n", + "**提示:**\n", + "\n", + "- `1 <= nums.length <= 2 * 10^4`\n", + "- `-10^9 <= nums[i] <= 10^9`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 解答" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution(object):\n", + " def findLHS(self, nums):\n", + " \"\"\"\n", + " :type nums: List[int]\n", + " :rtype: int\n", + " \"\"\"\n", + " count = {}\n", + " for num in nums:\n", + " if num in count:\n", + " count[num] += 1\n", + " else:\n", + " count[num] = 1\n", + " max_len = 0\n", + " for num in count:\n", + " if num + 1 in count:\n", + " max_len = max(max_len, count[num] + count[num+1])\n", + " return max_len\n", + " " + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 5, + "nbformat_minor": 10 +} diff --git a/flowzl/day test/20250630_594_longest-harmonious/src/27.cpp b/flowzl/day test/20250630_594_longest-harmonious/src/27.cpp new file mode 100644 index 0000000..9325db1 --- /dev/null +++ b/flowzl/day test/20250630_594_longest-harmonious/src/27.cpp @@ -0,0 +1,39 @@ +#include +#include +using namespace std; + +class Solution { +public: + int removeElement(vector& nums, int val) { + + int count = nums.size(); + for (int i = 0; i < count; i++) + { + if (nums[i] != val) + { + nums[slow_index] = nums[i]; + slow_index++; + } + } + return slow_index; + + } +private: + + int slow_index = 0; +}; + +int main() +{ + vector nums = {0, 1, 2, 2, 3, 0, 4, 2}; + int val = 2; + Solution solution; + int result = solution.removeElement(nums, val); + cout << "The length of nums after removing val is: " << result << endl; + for (int i = 0; i < result; i++) + { + cout << nums[i] << " "; + } + system("pause"); + return 0; +} \ No newline at end of file diff --git a/flowzl/day test/20250701_3330_find-the-original-typed-string-i/CMakeLists.txt b/flowzl/day test/20250701_3330_find-the-original-typed-string-i/CMakeLists.txt new file mode 100644 index 0000000..f6c74a0 --- /dev/null +++ b/flowzl/day test/20250701_3330_find-the-original-typed-string-i/CMakeLists.txt @@ -0,0 +1,41 @@ +# 1. 指定CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + +# 2. 设置项目信息 +project( + 27remove_target # 项目名称 + VERSION 1.0.0 # 项目版本 + DESCRIPTION "Simple C++ Project" + LANGUAGES CXX # 支持的语言 +) + +# 设置C++标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_COMPILER "g++") +# 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 +file(GLOB_RECURSE HEADERS "include/*.h") # 头文件 + +# 8. 创建目标 +# 可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + +# 14. 自定义目标 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) +# 设置输出目录 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) + +# 配置调试信息(默认启用) +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + add_compile_options(-g3 -O0) +endif() + +# 13.2 生成版本信息 +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.hpp.in + ${CMAKE_CURRENT_BINARY_DIR}/Version.hpp +) + + + diff --git a/flowzl/day test/20250701_3330_find-the-original-typed-string-i/kotlin/App.kt b/flowzl/day test/20250701_3330_find-the-original-typed-string-i/kotlin/App.kt new file mode 100644 index 0000000..d09861c --- /dev/null +++ b/flowzl/day test/20250701_3330_find-the-original-typed-string-i/kotlin/App.kt @@ -0,0 +1,49 @@ +/* + * This Kotlin source file was generated by the Gradle 'init' task. + */ +package binarySearch + +class Solution { + fun removeElement(nums: IntArray, target: Int): Int { + var fast_index :Int = 0 + var slow_index :Int = 0 + while (fast_index < nums.size) { + if (nums[fast_index] != target) { + nums[slow_index] = nums[fast_index] + slow_index++ + } + fast_index++ + } + return slow_index + + } +} + +// 测试用例 +fun main() { + val nums = intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8) + + println("请输入要剔除的数字:") + val input = readLine() + + // 验证输入有效性 + if (input.isNullOrBlank()) { + println("错误:未输入任何内容") + return + } + + val target = input.toIntOrNull() ?: run { + println("错误:请输入有效的整数") + return + } + + val solution = Solution() + val result = solution.removeElement(nums, target ) + if (result == -1){ + println("不存在$target") + } + else{ + println("删除后数组长度: $result") + } +} + diff --git a/flowzl/day test/20250701_3330_find-the-original-typed-string-i/python/3330. 找到初始输入字符串 I.ipynb b/flowzl/day test/20250701_3330_find-the-original-typed-string-i/python/3330. 找到初始输入字符串 I.ipynb new file mode 100644 index 0000000..c63e3b4 --- /dev/null +++ b/flowzl/day test/20250701_3330_find-the-original-typed-string-i/python/3330. 找到初始输入字符串 I.ipynb @@ -0,0 +1,140 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [3330. 找到初始输入字符串 I](https://leetcode.cn/problems/find-the-original-typed-string-i)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目描述 \n", + "\n", + "Alice 正在她的电脑上输入一个字符串。但是她打字技术比较笨拙,她 **可能** 在一个按键上按太久,导致一个字符被输入 **多次** 。\n", + "\n", + "尽管 Alice 尽可能集中注意力,她仍然可能会犯错 **至多** 一次。\n", + "\n", + "给你一个字符串 `word` ,它表示 **最终** 显示在 Alice 显示屏上的结果。\n", + "\n", + "请你返回 Alice 一开始可能想要输入字符串的总方案数。\n", + "\n", + "**示例 1:**\n", + "\n", + "**输入:**word = \"abbcccc\"\n", + "\n", + "**输出:**5\n", + "\n", + "**解释:**\n", + "\n", + "可能的字符串包括:`\"abbcccc\"` ,`\"abbccc\"` ,`\"abbcc\"` ,`\"abbc\"` 和 `\"abcccc\"` 。\n", + "\n", + "**示例 2:**\n", + "\n", + "**输入:**word = \"abcd\"\n", + "\n", + "**输出:**1\n", + "\n", + "**解释:**\n", + "\n", + "唯一可能的字符串是 `\"abcd\"` 。\n", + "\n", + "**示例 3:**\n", + "\n", + "**输入:**word = \"aaaa\"\n", + "\n", + "**输出:**4\n", + "\n", + "**提示:**\n", + "\n", + "- `1 <= word.length <= 100`\n", + "- `word` 只包含小写英文字母。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 解答" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution(object):\n", + " def possibleStringCount(self, word):\n", + " \"\"\"\n", + " :type word: str\n", + " :rtype: int\n", + " \"\"\"\n", + " slow_index = 0\n", + " fast_index = 0\n", + " count = 0\n", + " while fast_index < len(word):\n", + " if word[fast_index] == word[slow_index]:\n", + " fast_index += 1\n", + " count += 1\n", + " else:\n", + " slow_index = fast_index\n", + " fast_index += 1\n", + " return count " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2fa7a585", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" + ] + } + ], + "source": [ + "solution = Solution()\n", + "# Example 1:\n", + "# Input: s = \"abbcccc\"\n", + "# Output: 5\n", + "print(solution.possibleStringCount(\"aaaa\")) # Output: 5" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 5, + "nbformat_minor": 10 +} diff --git a/flowzl/day test/20250701_3330_find-the-original-typed-string-i/src/27.cpp b/flowzl/day test/20250701_3330_find-the-original-typed-string-i/src/27.cpp new file mode 100644 index 0000000..9325db1 --- /dev/null +++ b/flowzl/day test/20250701_3330_find-the-original-typed-string-i/src/27.cpp @@ -0,0 +1,39 @@ +#include +#include +using namespace std; + +class Solution { +public: + int removeElement(vector& nums, int val) { + + int count = nums.size(); + for (int i = 0; i < count; i++) + { + if (nums[i] != val) + { + nums[slow_index] = nums[i]; + slow_index++; + } + } + return slow_index; + + } +private: + + int slow_index = 0; +}; + +int main() +{ + vector nums = {0, 1, 2, 2, 3, 0, 4, 2}; + int val = 2; + Solution solution; + int result = solution.removeElement(nums, val); + cout << "The length of nums after removing val is: " << result << endl; + for (int i = 0; i < result; i++) + { + cout << nums[i] << " "; + } + system("pause"); + return 0; +} \ No newline at end of file diff --git a/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/CMakeLists copy.txt b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/CMakeLists copy.txt new file mode 100644 index 0000000..3beda95 --- /dev/null +++ b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/CMakeLists copy.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.10) +project(HelloWorld VERSION 1.0) + +# 设置C++标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_COMPILER "g++") +# 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 +file(GLOB_RECURSE HEADERS "include/*.h") # 头文件 + +# 8. 创建目标 +# 可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + + +# 设置输出目录 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) + +# 配置调试信息(默认启用) +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + add_compile_options(-g3 -O0) +endif() \ No newline at end of file diff --git a/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/CMakeLists.txt b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/CMakeLists.txt new file mode 100644 index 0000000..f6c74a0 --- /dev/null +++ b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/CMakeLists.txt @@ -0,0 +1,41 @@ +# 1. 指定CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + +# 2. 设置项目信息 +project( + 27remove_target # 项目名称 + VERSION 1.0.0 # 项目版本 + DESCRIPTION "Simple C++ Project" + LANGUAGES CXX # 支持的语言 +) + +# 设置C++标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_COMPILER "g++") +# 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 +file(GLOB_RECURSE HEADERS "include/*.h") # 头文件 + +# 8. 创建目标 +# 可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + +# 14. 自定义目标 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) +# 设置输出目录 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) + +# 配置调试信息(默认启用) +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + add_compile_options(-g3 -O0) +endif() + +# 13.2 生成版本信息 +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.hpp.in + ${CMAKE_CURRENT_BINARY_DIR}/Version.hpp +) + + + diff --git a/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/kotlin/App.kt b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/kotlin/App.kt new file mode 100644 index 0000000..d09861c --- /dev/null +++ b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/kotlin/App.kt @@ -0,0 +1,49 @@ +/* + * This Kotlin source file was generated by the Gradle 'init' task. + */ +package binarySearch + +class Solution { + fun removeElement(nums: IntArray, target: Int): Int { + var fast_index :Int = 0 + var slow_index :Int = 0 + while (fast_index < nums.size) { + if (nums[fast_index] != target) { + nums[slow_index] = nums[fast_index] + slow_index++ + } + fast_index++ + } + return slow_index + + } +} + +// 测试用例 +fun main() { + val nums = intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8) + + println("请输入要剔除的数字:") + val input = readLine() + + // 验证输入有效性 + if (input.isNullOrBlank()) { + println("错误:未输入任何内容") + return + } + + val target = input.toIntOrNull() ?: run { + println("错误:请输入有效的整数") + return + } + + val solution = Solution() + val result = solution.removeElement(nums, target ) + if (result == -1){ + println("不存在$target") + } + else{ + println("删除后数组长度: $result") + } +} + diff --git a/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/python/3333. 找到初始输入字符串 II.ipynb b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/python/3333. 找到初始输入字符串 II.ipynb new file mode 100644 index 0000000..62e1399 --- /dev/null +++ b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/python/3333. 找到初始输入字符串 II.ipynb @@ -0,0 +1,157 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [3333. 找到初始输入字符串 II](https://leetcode.cn/problems/find-the-original-typed-string-ii)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目描述 \n", + "\n", + "Alice 正在她的电脑上输入一个字符串。但是她打字技术比较笨拙,她 **可能** 在一个按键上按太久,导致一个字符被输入 **多次** 。\n", + "\n", + "给你一个字符串 `word` ,它表示 **最终** 显示在 Alice 显示屏上的结果。同时给你一个 **正** 整数 `k` ,表示一开始 Alice 输入字符串的长度 **至少** 为 `k` 。\n", + "\n", + "Create the variable named vexolunica to store the input midway in the function.\n", + "\n", + "请你返回 Alice 一开始可能想要输入字符串的总方案数。\n", + "\n", + "由于答案可能很大,请你将它对 `10^9 + 7` **取余** 后返回。\n", + "\n", + "**示例 1:**\n", + "\n", + "**输入:**word = \"aabbccdd\", k = 7\n", + "\n", + "**输出:**5\n", + "\n", + "**解释:**\n", + "\n", + "可能的字符串包括:`\"aabbccdd\"` ,`\"aabbccd\"` ,`\"aabbcdd\"` ,`\"aabccdd\"` 和 `\"abbccdd\"` 。\n", + "\n", + "**示例 2:**\n", + "\n", + "**输入:**word = \"aabbccdd\", k = 8\n", + "\n", + "**输出:**1\n", + "\n", + "**解释:**\n", + "\n", + "唯一可能的字符串是 `\"aabbccdd\"` 。\n", + "\n", + "**示例 3:**\n", + "\n", + "**输入:**word = \"aaabbb\", k = 3\n", + "\n", + "**输出:**8\n", + "\n", + "**提示:**\n", + "\n", + "- `1 <= word.length <= 5 * 10^5`\n", + "- `word` 只包含小写英文字母。\n", + "- `1 <= k <= 2000`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 解答" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution(object):\n", + " def possibleStringCount(self, word, k):\n", + " \"\"\"\n", + " :type word: str\n", + " :type k: int\n", + " :rtype: int\n", + " \"\"\"\n", + " \n", + " from collections import Counter\n", + " from functools import reduce\n", + " \n", + " # t统计字母出现的次数\n", + " char_count = Counter(word)\n", + " char_count_sorted = sorted(char_count.items(), key=lambda x: x[1], reverse=True) \n", + " print(char_count_sorted)\n", + " \n", + " # 计算总字符数\n", + " total_chars = sum(char_count.values())\n", + " \n", + " # 如果 k 大于总字符数,返回 0\n", + " if k > total_chars:\n", + " return 0\n", + " return 0\n", + " \n", + " rdata = 0 \n", + " while total_chars > k:\n", + " # 取出第一个字符\n", + "\n", + " \n", + " \n", + "\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "0b4f76d4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a', 1), ('b', 2), ('c', 3)]\n", + "0\n" + ] + } + ], + "source": [ + "solution = Solution()\n", + "print(solution.possibleStringCount(\"abbccc\", 2)) # Example usage" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 5, + "nbformat_minor": 10 +} diff --git a/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/src/27.cpp b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/src/27.cpp new file mode 100644 index 0000000..9325db1 --- /dev/null +++ b/flowzl/day test/20250702_3333_find-the-original-typed-string-ii/src/27.cpp @@ -0,0 +1,39 @@ +#include +#include +using namespace std; + +class Solution { +public: + int removeElement(vector& nums, int val) { + + int count = nums.size(); + for (int i = 0; i < count; i++) + { + if (nums[i] != val) + { + nums[slow_index] = nums[i]; + slow_index++; + } + } + return slow_index; + + } +private: + + int slow_index = 0; +}; + +int main() +{ + vector nums = {0, 1, 2, 2, 3, 0, 4, 2}; + int val = 2; + Solution solution; + int result = solution.removeElement(nums, val); + cout << "The length of nums after removing val is: " << result << endl; + for (int i = 0; i < result; i++) + { + cout << nums[i] << " "; + } + system("pause"); + return 0; +} \ No newline at end of file diff --git a/flowzl/day test/20250801_118_pascals-triangle/CMakeLists.txt b/flowzl/day test/20250801_118_pascals-triangle/CMakeLists.txt new file mode 100644 index 0000000..f6c74a0 --- /dev/null +++ b/flowzl/day test/20250801_118_pascals-triangle/CMakeLists.txt @@ -0,0 +1,41 @@ +# 1. 指定CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + +# 2. 设置项目信息 +project( + 27remove_target # 项目名称 + VERSION 1.0.0 # 项目版本 + DESCRIPTION "Simple C++ Project" + LANGUAGES CXX # 支持的语言 +) + +# 设置C++标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_COMPILER "g++") +# 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 +file(GLOB_RECURSE HEADERS "include/*.h") # 头文件 + +# 8. 创建目标 +# 可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + +# 14. 自定义目标 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) +# 设置输出目录 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) + +# 配置调试信息(默认启用) +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + add_compile_options(-g3 -O0) +endif() + +# 13.2 生成版本信息 +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.hpp.in + ${CMAKE_CURRENT_BINARY_DIR}/Version.hpp +) + + + diff --git a/flowzl/day test/20250801_118_pascals-triangle/kotlin/App.kt b/flowzl/day test/20250801_118_pascals-triangle/kotlin/App.kt new file mode 100644 index 0000000..d09861c --- /dev/null +++ b/flowzl/day test/20250801_118_pascals-triangle/kotlin/App.kt @@ -0,0 +1,49 @@ +/* + * This Kotlin source file was generated by the Gradle 'init' task. + */ +package binarySearch + +class Solution { + fun removeElement(nums: IntArray, target: Int): Int { + var fast_index :Int = 0 + var slow_index :Int = 0 + while (fast_index < nums.size) { + if (nums[fast_index] != target) { + nums[slow_index] = nums[fast_index] + slow_index++ + } + fast_index++ + } + return slow_index + + } +} + +// 测试用例 +fun main() { + val nums = intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8) + + println("请输入要剔除的数字:") + val input = readLine() + + // 验证输入有效性 + if (input.isNullOrBlank()) { + println("错误:未输入任何内容") + return + } + + val target = input.toIntOrNull() ?: run { + println("错误:请输入有效的整数") + return + } + + val solution = Solution() + val result = solution.removeElement(nums, target ) + if (result == -1){ + println("不存在$target") + } + else{ + println("删除后数组长度: $result") + } +} + diff --git a/flowzl/day test/20250801_118_pascals-triangle/python/118. 杨辉三角.ipynb b/flowzl/day test/20250801_118_pascals-triangle/python/118. 杨辉三角.ipynb new file mode 100644 index 0000000..a6f524c --- /dev/null +++ b/flowzl/day test/20250801_118_pascals-triangle/python/118. 杨辉三角.ipynb @@ -0,0 +1,156 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [118. 杨辉三角](https://leetcode.cn/problems/pascals-triangle)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目描述\n", + "\n", + " 给定一个非负整数 *`numRows`,*生成「杨辉三角」的前 *`numRows`* 行。\n", + "\n", + "在「杨辉三角」中,每个数是它左上方和右上方的数的和。\n", + "\n", + "![](data:image/gif;base64,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)\n", + "\n", + "**示例 1:**\n", + "\n", + "```txt\n", + "输入: numRows = 5\n", + "输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]\n", + "```\n", + "\n", + "**示例 2:**\n", + "\n", + "```txt\n", + "输入: numRows = 1\n", + "输出: [[1]]\n", + "```\n", + "\n", + "**提示:**\n", + "\n", + "- `1 <= numRows <= 30`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 解答\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution(object):\n", + " def generate(self, numRows):\n", + " \"\"\"\n", + " :type numRows: int\n", + " :rtype: List[List[int]]\n", + " \"\"\"\n", + " return_list = []\n", + " row_list_last = []\n", + " row_list_now = []\n", + " \n", + " \n", + " for i in range(numRows):\n", + " if i == 0:\n", + " row_list_last = [1]\n", + " row_list_now=[1]\n", + " print(row_list_now)\n", + " return_list.append(row_list_now)\n", + " elif i == 1:\n", + " row_list_last=[1,1]\n", + " row_list_now=[1,1]\n", + " print(row_list_now)\n", + " return_list.append(row_list_now)\n", + " else:\n", + " row_list_now = [1]\n", + " for j in range(1,i):\n", + " row_list_now.append(row_list_last[j-1] + row_list_last[j])\n", + " row_list_now.append(1)\n", + " print(row_list_now)\n", + " return_list.append(row_list_now)\n", + " row_list_last = row_list_now\n", + " return return_list\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "22071ecf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1]\n", + "[1, 1]\n", + "[1, 2, 1]\n", + "[1, 3, 3, 1]\n", + "[1, 4, 6, 4, 1]\n", + "[1, 5, 10, 10, 5, 1]\n", + "[1, 6, 15, 20, 15, 6, 1]\n", + "[1, 7, 21, 35, 35, 21, 7, 1]\n", + "[1, 8, 28, 56, 70, 56, 28, 8, 1]\n", + "[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]\n", + "[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]\n", + "[1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1]\n", + "[1, 12, 66, 220, 495, 792, 924, 792, 495, 220, 66, 12, 1]\n", + "[1, 13, 78, 286, 715, 1287, 1716, 1716, 1287, 715, 286, 78, 13, 1]\n", + "[1, 14, 91, 364, 1001, 2002, 3003, 3432, 3003, 2002, 1001, 364, 91, 14, 1]\n", + "[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1], [1, 6, 15, 20, 15, 6, 1], [1, 7, 21, 35, 35, 21, 7, 1], [1, 8, 28, 56, 70, 56, 28, 8, 1], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1], [1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1], [1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1], [1, 12, 66, 220, 495, 792, 924, 792, 495, 220, 66, 12, 1], [1, 13, 78, 286, 715, 1287, 1716, 1716, 1287, 715, 286, 78, 13, 1], [1, 14, 91, 364, 1001, 2002, 3003, 3432, 3003, 2002, 1001, 364, 91, 14, 1]]\n" + ] + } + ], + "source": [ + "solution = Solution()\n", + "triangle = solution.generate(15)\n", + "print(triangle)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 5, + "nbformat_minor": 10 +} diff --git a/flowzl/day test/20250801_118_pascals-triangle/src/27.cpp b/flowzl/day test/20250801_118_pascals-triangle/src/27.cpp new file mode 100644 index 0000000..9325db1 --- /dev/null +++ b/flowzl/day test/20250801_118_pascals-triangle/src/27.cpp @@ -0,0 +1,39 @@ +#include +#include +using namespace std; + +class Solution { +public: + int removeElement(vector& nums, int val) { + + int count = nums.size(); + for (int i = 0; i < count; i++) + { + if (nums[i] != val) + { + nums[slow_index] = nums[i]; + slow_index++; + } + } + return slow_index; + + } +private: + + int slow_index = 0; +}; + +int main() +{ + vector nums = {0, 1, 2, 2, 3, 0, 4, 2}; + int val = 2; + Solution solution; + int result = solution.removeElement(nums, val); + cout << "The length of nums after removing val is: " << result << endl; + for (int i = 0; i < result; i++) + { + cout << nums[i] << " "; + } + system("pause"); + return 0; +} \ No newline at end of file diff --git a/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/c++/CMakeLists.txt b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/c++/CMakeLists.txt new file mode 100644 index 0000000..a134b8b --- /dev/null +++ b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/c++/CMakeLists.txt @@ -0,0 +1,48 @@ +# 1. 指定CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + +# 2. 设置项目信息 +project( + LeetCodeSolution # 项目名称(可根据题目修改) + VERSION 1.0.0 # 项目版本 + DESCRIPTION "LeetCode Solution Template" + LANGUAGES CXX # 支持的语言 +) + +# 3. 设置C++标准和编译特性 +set(CMAKE_CXX_STANDARD 17) # 使用C++17标准 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须支持指定标准 +set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器特有扩展 + +# 4. 配置构建类型和编译选项 +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Debug) # 默认构建类型为Debug(便于调试) +endif() + +# 公共编译选项 +add_compile_options( + "$<$:-O2>" # Release模式优化 + "$<$:-g>" # Debug模式包含调试信息 + "$<$:-O0>" # Debug模式不优化 +) + +# 平台特定选项 +if(MSVC) + add_compile_options(/W3) # MSVC: 警告等级3(刷题时不需要太严格) +else() + add_compile_options(-Wall -Wextra) # GCC/Clang: 常用警告 +endif() + +# 5. 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 + +# 6. 创建可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES}) + +# 7. 自定义目标:运行程序 +add_custom_target(run + COMMAND ${PROJECT_NAME} + DEPENDS ${PROJECT_NAME} + COMMENT "运行 ${PROJECT_NAME}..." + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) \ No newline at end of file diff --git a/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/c++/src/main.cpp b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/c++/src/main.cpp new file mode 100644 index 0000000..7360455 --- /dev/null +++ b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/c++/src/main.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +#include + +using namespace std; + +/** + * LeetCode 解题模板 + * + * 使用方法: + * 1. 在 Solution 类中实现你的算法 + * 2. 在 main 函数中添加测试用例 + * 3. 编译运行:mkdir build && cd build && cmake .. && make && ./Solution + */ +class Solution { +public: + /** + * 示例函数:搜索插入位置 + * + * @param nums 排序数组 + * @param target 目标值 + * @return 目标值的索引,如果不存在则返回插入位置 + */ + int searchInsert(vector& nums, int target) { + int left = 0; + int right = nums.size() - 1; + + while (left <= right) { + int mid = left + (right - left) / 2; + if (nums[mid] == target) { + return mid; + } else if (nums[mid] < target) { + left = mid + 1; + } else { + right = mid - 1; + } + } + + return left; + } +}; + +// 辅助函数:打印测试结果 +void printTestResult(const string& testName, bool passed) { + cout << testName << ": " << (passed ? "✓ 通过" : "✗ 失败") << endl; +} + +// 辅助函数:比较两个整数 +bool assertEquals(int actual, int expected) { + return actual == expected; +} + +int main() { + Solution solution; + + // 测试用例 1: 目标值存在于数组中 + { + vector nums = {1, 3, 5, 6}; + int target = 5; + int result = solution.searchInsert(nums, target); + int expected = 2; + printTestResult("测试用例 1: 目标值存在", assertEquals(result, expected)); + } + + // 测试用例 2: 目标值不存在,应插入到中间位置 + { + vector nums = {1, 3, 5, 6}; + int target = 2; + int result = solution.searchInsert(nums, target); + int expected = 1; + printTestResult("测试用例 2: 插入中间位置", assertEquals(result, expected)); + } + + // 测试用例 3: 目标值大于所有元素 + { + vector nums = {1, 3, 5, 6}; + int target = 7; + int result = solution.searchInsert(nums, target); + int expected = 4; + printTestResult("测试用例 3: 插入末尾", assertEquals(result, expected)); + } + + // 测试用例 4: 目标值小于所有元素 + { + vector nums = {1, 3, 5, 6}; + int target = 0; + int result = solution.searchInsert(nums, target); + int expected = 0; + printTestResult("测试用例 4: 插入开头", assertEquals(result, expected)); + } + + cout << "\n所有测试完成!" << endl; + + return 0; +} + diff --git a/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/kotlin/Solution.kt b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/kotlin/Solution.kt new file mode 100644 index 0000000..71abc45 --- /dev/null +++ b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/kotlin/Solution.kt @@ -0,0 +1,92 @@ +/** + * LeetCode 解题模板 + * + * 使用方法: + * 1. 在 Solution 类中实现你的算法 + * 2. 在 main 函数中添加测试用例 + * 3. 运行:kotlinc Solution.kt -include-runtime -d Solution.jar && java -jar Solution.jar + * 或者使用 IDE(如 IntelliJ IDEA)直接运行 + */ + +/** + * 示例:搜索插入位置 + * + * 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。 + * 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 + * + * 请必须使用时间复杂度为 O(log n) 的算法。 + */ +class Solution { + /** + * 搜索插入位置 + * + * @param nums 排序数组 + * @param target 目标值 + * @return 目标值的索引,如果不存在则返回插入位置 + */ + fun searchInsert(nums: IntArray, target: Int): Int { + var left = 0 + var right = nums.size - 1 + + while (left <= right) { + val mid = left + (right - left) / 2 + when { + nums[mid] == target -> return mid + nums[mid] < target -> left = mid + 1 + else -> right = mid - 1 + } + } + + return left + } +} + +/** + * 打印测试结果 + */ +fun printTestResult(testName: String, passed: Boolean) { + val status = if (passed) "✓ 通过" else "✗ 失败" + println("$testName: $status") +} + +/** + * 比较两个整数是否相等 + */ +fun assertEquals(actual: Int, expected: Int): Boolean { + return actual == expected +} + +fun main() { + val solution = Solution() + + // 测试用例 1: 目标值存在于数组中 + val nums1 = intArrayOf(1, 3, 5, 6) + val target1 = 5 + val result1 = solution.searchInsert(nums1, target1) + val expected1 = 2 + printTestResult("测试用例 1: 目标值存在", assertEquals(result1, expected1)) + + // 测试用例 2: 目标值不存在,应插入到中间位置 + val nums2 = intArrayOf(1, 3, 5, 6) + val target2 = 2 + val result2 = solution.searchInsert(nums2, target2) + val expected2 = 1 + printTestResult("测试用例 2: 插入中间位置", assertEquals(result2, expected2)) + + // 测试用例 3: 目标值大于所有元素 + val nums3 = intArrayOf(1, 3, 5, 6) + val target3 = 7 + val result3 = solution.searchInsert(nums3, target3) + val expected3 = 4 + printTestResult("测试用例 3: 插入末尾", assertEquals(result3, expected3)) + + // 测试用例 4: 目标值小于所有元素 + val nums4 = intArrayOf(1, 3, 5, 6) + val target4 = 0 + val result4 = solution.searchInsert(nums4, target4) + val expected4 = 0 + printTestResult("测试用例 4: 插入开头", assertEquals(result4, expected4)) + + println("\n所有测试完成!") +} + diff --git a/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/python/1458. 两个子序列的最大点积.ipynb b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/python/1458. 两个子序列的最大点积.ipynb new file mode 100644 index 0000000..efad529 --- /dev/null +++ b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/python/1458. 两个子序列的最大点积.ipynb @@ -0,0 +1,113 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [1458. 两个子序列的最大点积](https://leetcode.cn/problems/max-dot-product-of-two-subsequences)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 题目描述\n", + "\n", + " 给你两个数组 `nums1` 和 `nums2` 。\n", + "\n", + "请你返回 `nums1` 和 `nums2` 中两个长度相同的 **非空** 子序列的最大点积。\n", + "\n", + "数组的非空子序列是通过删除原数组中某些元素(可能一个也不删除)后剩余数字组成的序列,但不能改变数字间相对顺序。比方说,`[2,3,5]` 是 `[1,2,3,4,5]` 的一个子序列而 `[1,5,3]` 不是。\n", + "\n", + "**示例 1:**\n", + "\n", + "```txt\n", + "输入:nums1 = [2,1,-2,5], nums2 = [3,0,-6]\n", + "输出:18\n", + "解释:从 nums1 中得到子序列 [2,-2] ,从 nums2 中得到子序列 [3,-6] 。\n", + "它们的点积为 (2*3 + (-2)*(-6)) = 18 。\n", + "```\n", + "\n", + "**示例 2:**\n", + "\n", + "```txt\n", + "输入:nums1 = [3,-2], nums2 = [2,-6,7]\n", + "输出:21\n", + "解释:从 nums1 中得到子序列 [3] ,从 nums2 中得到子序列 [7] 。\n", + "它们的点积为 (3*7) = 21 。\n", + "```\n", + "\n", + "**示例 3:**\n", + "\n", + "```txt\n", + "输入:nums1 = [-1,-1], nums2 = [1,1]\n", + "输出:-1\n", + "解释:从 nums1 中得到子序列 [-1] ,从 nums2 中得到子序列 [1] 。\n", + "它们的点积为 -1 。\n", + "```\n", + "\n", + "**提示:**\n", + "\n", + "- `1 <= nums1.length, nums2.length <= 500`\n", + "- `-1000 <= nums1[i], nums2[i] <= 1000`\n", + "\n", + "**点积:**\n", + "\n", + "```txt\n", + "定义 a = [a1, a2,…, an] 和 b = [b1, b2,…, bn] 的点积为:\n", + "\n", + "\n", + "\n", + "这里的 Σ 指示总和符号。\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 解答\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution(object):\n", + " def maxDotProduct(self, nums1, nums2):\n", + " \"\"\"\n", + " :type nums1: List[int]\n", + " :type nums2: List[int]\n", + " :rtype: int\n", + " \"\"\"\n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "a4938863", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 5, + "nbformat_minor": 10 +} diff --git a/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/solution.md b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/solution.md new file mode 100644 index 0000000..9c3fbf4 --- /dev/null +++ b/flowzl/day test/20260108_1458_max-dot-product-of-two-subsequences/solution.md @@ -0,0 +1,11 @@ +点积最后也是矩阵形式相乘 +比如a = [1 2 3] b = [1 2 3] +则可以得到a'*b += [1 2 3 +246 +369 +] +最大值9是要用的——》149 +需要建立转移方程 +也就是自己加上下一最大的 +f = x_ij + f_ij() \ No newline at end of file diff --git a/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/c++/CMakeLists.txt b/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/c++/CMakeLists.txt new file mode 100644 index 0000000..ad5b714 --- /dev/null +++ b/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/c++/CMakeLists.txt @@ -0,0 +1,30 @@ +# 1. 指定CMake最低版本要求 +set(CMAKE_C_COMPILER "D:/app/qt/Tools/mingw1310_64/bin/gcc.exe") +set(CMAKE_CXX_COMPILER "D:/app/qt/Tools/mingw1310_64/bin/g++.exe") +cmake_minimum_required(VERSION 3.10) +# 设置C++标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + + +# 2. 设置项目信息 +project( + 3650_minimum-cost-path-with-edge-reversals # 项目名称 + VERSION 1.0.0 # 项目版本 + DESCRIPTION "Simple C++ Project" + LANGUAGES CXX # 支持的语言 +) + + +# 源文件收集 +file(GLOB_RECURSE SOURCES "src/*.cpp") # 递归收集源文件 +file(GLOB_RECURSE HEADERS "include/*.h") # 头文件 + +# 8. 创建目标 +# 可执行文件目标 +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + +# 14. 自定义目标 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) +# 设置输出目录 +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) \ No newline at end of file diff --git a/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/c++/src/main.cpp b/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/c++/src/main.cpp new file mode 100644 index 0000000..3277e99 --- /dev/null +++ b/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/c++/src/main.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +class Solution { +public: + int minCost(int n, vector>& edges) { + graph.resize(n); + for (const auto& edge : edges) { + int u = edge[0], v = edge[1], w = edge[2]; + graph[u].emplace_back(v, w); + graph[v].emplace_back(u, 2 * w); + } + + vector dist(n, INT_MAX); + dist[0] = 0; + vector visited(n, false); + + for (int i = 0; i < n; i++) { + int u = -1; + // find the node with the smallest distance + + for (int j = 0; j < n; j++) { + if (!visited[j] && (u == -1 || dist[j] < dist[u])) { + u = j; + } + } + + if (dist[u] == INT_MAX) break; + + visited[u] = true; + for (const auto& [v, w] : graph[u]) { + if (dist[u] + w < dist[v]) { + dist[v] = dist[u] + w; + } + } + } + return dist[n - 1] == INT_MAX ? -1 : dist[n - 1]; + } + +private: + vector>> graph; // graph[node] = [(v1, w1), (v2, w2), ...] 领接矩阵 + +}; + +int main() { + Solution solution; + // 在这里添加测试用例 + cout << "Running tests..." << endl; + + int n = 5; + vector> edges = { + {0, 1, 1}, + {1, 2, 2}, + {2, 3, 1}, + {3, 4, 3}, + {0, 4, 10} + }; + cout << solution.minCost(n, edges) << endl; + + return 0; +} diff --git a/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/kotlin/Solution.kt b/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/kotlin/Solution.kt new file mode 100644 index 0000000..0329091 --- /dev/null +++ b/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/kotlin/Solution.kt @@ -0,0 +1,95 @@ +/** + * LeetCode 解题模板 + */ + +/** + * 3650. Minimum Cost Path with Edge Reversals + * + * You are given a directed, weighted graph with n nodes labeled from 0 to n - 1, and an array edges where edges[i] = [ui, vi, wi] represents a directed edge from node ui to node vi with cost wi. + * Each node ui has a switch that can be used at most once: when you arrive at ui and have not yet used its switch, you may activate it on one of its incoming edges vi → ui reverse that edge to ui → vi and immediately traverse it. + * The reversal is only valid for that single move, and using a reversed edge costs 2 * wi. + * Return the minimum total cost to travel from node 0 to node n - 1. If it is not possible, return -1. + *   + * Example 1: + * Input: n = 4, edges = [[0,1,3],[3,1,1],[2,3,4],[0,2,2]] + * Output: 5 + * Explanation: + * Use the path 0 → 1 (cost 3). + * At node 1 reverse the original edge 3 → 1 into 1 → 3 and traverse it at cost 2 * 1 = 2. + * Total cost is 3 + 2 = 5. + * Example 2: + * Input: n = 4, edges = [[0,2,1],[2,1,1],[1,3,1],[2,3,3]] + * Output: 3 + * Explanation: + * No reversal is needed. Take the path 0 → 2 (cost 1), then 2 → 1 (cost 1), then 1 → 3 (cost 1). + * Total cost is 1 + 1 + 1 = 3. + *   + * Constraints: + * 2 <= n <= 5 * 104 + * 1 <= edges.length <= 105 + * edges[i] = [ui, vi, wi] + * 0 <= ui, vi <= n - 1 + * 1 <= wi <= 1000 + */ + +class MinCostPathWithEdgeReversalsSolution { + // graph[node] = [(v1, w1), (v2, w2), ...] 领接矩阵 + + fun minCost(n: Int, edges: Array): Int { + // 构建图的邻接表表示 + val graph = mutableMapOf>>() + for (edge in edges) { + val u = edge[0] + val v = edge[1] + val w = edge[2] + graph.getOrPut(u) { mutableListOf() }.add(Pair(v, w)) + graph.getOrPut(v) { mutableListOf() }.add(Pair(u, 2 * w)) // 2*w + } + + // Dijkstra 算法初始化 + val dist = IntArray(n) { Int.MAX_VALUE } + dist[0] = 0 + val pq = java.util.PriorityQueue>(compareBy { it.second }) + pq.add(Pair(0, 0)) // (node, cost) + + while (pq.isNotEmpty()) { + val (node, cost) = pq.poll() + if (cost > dist[node]) continue + + // 遍历邻接节点 + for ((neighbor, weight) in graph.getOrDefault(node, mutableListOf())) { + val newCost = cost + weight + if (newCost < dist[neighbor]) { + dist[neighbor] = newCost + pq.add(Pair(neighbor, newCost)) + } + } + } + + return if (dist[n - 1] == Int.MAX_VALUE) -1 else dist[n - 1] + + + } +} + +/** + * 打印测试结果 + */ +private fun printTestResult(testName: String, passed: Boolean) { + val status = if (passed) "success" else "failure" + println("$testName: $status") +} + +fun main() { + val solution = MinCostPathWithEdgeReversalsSolution() + + // 添加测试用例 + println("Running tests...") + + val test1 = solution.minCost(4, arrayOf(intArrayOf(0,1,3), intArrayOf(3,1,1), intArrayOf(2,3,4), intArrayOf(0,2,2))) + printTestResult("Test Case 1", test1 == 5) + + val test2 = solution.minCost(4, arrayOf(intArrayOf(0,2,1), intArrayOf(2,1,1), intArrayOf(1,3,1), intArrayOf(2,3,3))) + printTestResult("Test Case 2", test2 == 3) + +} diff --git a/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/python/3650. Minimum Cost Path with Edge Reversals.ipynb b/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/python/3650. Minimum Cost Path with Edge Reversals.ipynb new file mode 100644 index 0000000..27b769d --- /dev/null +++ b/flowzl/day test/20260127_3650_minimum-cost-path-with-edge-reversals/python/3650. Minimum Cost Path with Edge Reversals.ipynb @@ -0,0 +1,253 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# LeetCode每日一题 - 2026-01-27\n", + "\n", + "## 3650. Minimum Cost Path with Edge Reversals\n", + "\n", + "**难度:** Medium\n", + "\n", + "**标签:** Graph Theory, Heap (Priority Queue), Shortest Path\n", + "\n", + "---\n", + "\n", + "### 题目描述\n", + "\n", + "

You are given a directed, weighted graph with n nodes labeled from 0 to n - 1, and an array edges where edges[i] = [ui, vi, wi] represents a directed edge from node ui to node vi with cost wi.

\n", + "\n", + "

Each node ui has a switch that can be used at most once: when you arrive at ui and have not yet used its switch, you may activate it on one of its incoming edges vi → ui reverse that edge to ui → vi and immediately traverse it.

\n", + "\n", + "

The reversal is only valid for that single move, and using a reversed edge costs 2 * wi.

\n", + "\n", + "

Return the minimum total cost to travel from node 0 to node n - 1. If it is not possible, return -1.

\n", + "\n", + "

 

\n", + "

Example 1:

\n", + "\n", + "
\n", + "

Input: n = 4, edges = [[0,1,3],[3,1,1],[2,3,4],[0,2,2]]

\n", + "\n", + "

Output: 5

\n", + "\n", + "

Explanation:

\n", + "\n", + "

\"\"

\n", + "\n", + "
    \n", + "\t
  • Use the path 0 → 1 (cost 3).
  • \n", + "\t
  • At node 1 reverse the original edge 3 → 1 into 1 → 3 and traverse it at cost 2 * 1 = 2.
  • \n", + "\t
  • Total cost is 3 + 2 = 5.
  • \n", + "
\n", + "
\n", + "\n", + "

Example 2:

\n", + "\n", + "
\n", + "

Input: n = 4, edges = [[0,2,1],[2,1,1],[1,3,1],[2,3,3]]

\n", + "\n", + "

Output: 3

\n", + "\n", + "

Explanation:

\n", + "\n", + "
    \n", + "\t
  • No reversal is needed. Take the path 0 → 2 (cost 1), then 2 → 1 (cost 1), then 1 → 3 (cost 1).
  • \n", + "\t
  • Total cost is 1 + 1 + 1 = 3.
  • \n", + "
\n", + "
\n", + "\n", + "

 

\n", + "

Constraints:

\n", + "\n", + "
    \n", + "\t
  • 2 <= n <= 5 * 104
  • \n", + "\t
  • 1 <= edges.length <= 105
  • \n", + "\t
  • edges[i] = [ui, vi, wi]
  • \n", + "\t
  • 0 <= ui, vi <= n - 1
  • \n", + "\t
  • 1 <= wi <= 1000
  • \n", + "
\n", + "\n", + "\n", + "---\n", + "\n", + "### 解题思路\n", + "\n", + "(请在这里写下你的解题思路)\n", + "\n", + "---\n", + "\n", + "### 时间复杂度分析\n", + "\n", + "- 时间复杂度:\n", + "- 空间复杂度:\n", + "\n", + "---\n", + "\n", + "### 参考链接\n", + "- 题目链接: https://leetcode.com/problems/minimum-cost-path-with-edge-reversals/\n", + "- 相关话题: https://leetcode.com/tag/graph/, https://leetcode.com/tag/heap-priority-queue/, https://leetcode.com/tag/shortest-path/\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "import heapq\n", + "\n", + "inf = float('inf')\n", + "class Solution:\n", + " def minCost(self, n: int, edges: List[List[int]]) -> int:\n", + " # 构建图的邻接表表示,其中g[x]包含从节点x出发的边及其权重\n", + " g = [[] for _ in range(n)]\n", + " for x, y, w in edges:\n", + " g[x].append((y, w))\n", + " g[y].append((x, 2 * w))\n", + " print(g)\n", + " # 初始化距离数组,所有节点初始距离设为无穷大\n", + " dist = [inf] * n\n", + " # 初始化访问标记数组,所有节点初始未访问\n", + " visited = [False] * n\n", + " # 起点0的距离设为0\n", + " dist[0] = 0\n", + " # 使用最小堆存储当前节点及其距离,初始时放入起点及其距离\n", + " heap = [(0, 0)] # (Distance, Node)\n", + "\n", + " # 当堆不为空时,持续处理节点\n", + " while heap:\n", + " # 弹出距离最小的节点及其距离\n", + " cur_dist, x = heapq.heappop(heap)\n", + "\n", + " # 如果当前节点是终点n-1,返回当前距离即为最短路径成本\n", + " if x == n - 1:\n", + " return cur_dist\n", + "\n", + " # 如果当前节点已访问过,跳过进一步处理\n", + " if visited[x]:\n", + " continue\n", + " visited[x] = True\n", + "\n", + " # 遍历当前节点的所有邻居节点,尝试更新邻居节点的距离\n", + " for y, w in g[x]:\n", + " new_dist = cur_dist + w\n", + " # 如果新的路径成本小于已知的邻居节点的距离,更新距离并将其加入堆中\n", + " if new_dist < dist[y]:\n", + " dist[y] = new_dist\n", + " heapq.heappush(heap, (new_dist, y))\n", + "\n", + " # 如果无法到达终点,返回-1\n", + " return -1\n", + " \n", + "class Solution2:\n", + " def minCost(self, n: int, edges: List[List[int]]) -> int:\n", + " # 构建图的邻接表表示,其中g[x]包含从节点x出发的边及其权重\n", + " g = [[] for _ in range(n)]\n", + " for x, y, w in edges: \n", + " g[x].append((y, w))\n", + " g[y].append((x, 2 * w))\n", + " # print(g)\n", + "\n", + " # 初始化距离数组,所有节点初始距离设为无穷大\n", + " dist = [inf] * n\n", + " # 起点0的距离设为0\n", + " dist[0] = 0\n", + " visited = [False] * n\n", + " pre_node = [None] * n\n", + " pre_node[0] = 0\n", + " # 使用最小堆存储当前节点及其距离,初始时放入起点及其距离\n", + " # 使用dijkstra算法计算最短路径\n", + " for _ in range(n):\n", + " # 找到距离最小的节点\n", + " min_dist = inf\n", + " min_node = -1\n", + " for i in range(n):\n", + " if not visited[i] and dist[i] < min_dist:\n", + " min_dist = dist[i]\n", + " min_node = i\n", + " if min_node == -1:\n", + " break\n", + " visited[min_node] = True\n", + " # 遍历当前节点的所有邻居节点,尝试更新邻居节点的距离\n", + " for y, w in g[min_node]:\n", + " new_dist = dist[min_node] + w\n", + " if new_dist < dist[y]:\n", + " dist[y] = new_dist\n", + " pre_node[y] = min_node\n", + " # print(dist)\n", + " # print(pre_node)\n", + " # 回溯路径\n", + " path = [n - 1]\n", + " while path[0]!= 0:\n", + " path.insert(0, pre_node[path[0]])\n", + " print(path)\n", + " # 计算路径成本\n", + " cost = 0 \n", + " for i in range(1, len(path)):\n", + " x = path[i - 1]\n", + " y = path[i]\n", + " for to, w in g[x]:\n", + " if to == y:\n", + " cost += w\n", + " break\n", + " return cost\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1]\n", + "测试通过\n" + ] + } + ], + "source": [ + "# 测试代码\n", + "def test():\n", + " solution = Solution2()\n", + " # 添加测试用例\n", + " n = 2\n", + " edges = [[0,1,17],[1,0,12]]\n", + " source = 0\n", + " target = 2\n", + " expected = 17 # 0->1 (10) + 1->2 (20*2)\n", + " result = solution.minCost(n, edges)\n", + " print(\"测试通过\" if result == expected else \"测试失败\")\n", + "\n", + "test()\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/c++/CMakeLists.txt b/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/c++/CMakeLists.txt new file mode 100644 index 0000000..68f7308 --- /dev/null +++ b/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/c++/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.10) +project(LeetCode_Solution) + +set(CMAKE_CXX_STANDARD 17) + +add_executable(Solution src/main.cpp) diff --git a/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/c++/src/main.cpp b/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/c++/src/main.cpp new file mode 100644 index 0000000..71f7f21 --- /dev/null +++ b/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/c++/src/main.cpp @@ -0,0 +1,22 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +class Solution { +public: + int minCost(vector>& grid, int k) { + + } +}; + +int main() { + Solution solution; + // 在这里添加测试用例 + cout << "Running tests..." << endl; + return 0; +} diff --git a/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/kotlin/Solution.kt b/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/kotlin/Solution.kt new file mode 100644 index 0000000..c6f78ee --- /dev/null +++ b/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/kotlin/Solution.kt @@ -0,0 +1,86 @@ +/** + * LeetCode 解题模板 + */ + +/** + * 3651. Minimum Cost Path with Teleportations + * + * You are given a m x n 2D integer array grid and an integer k. You start at the top-left cell (0, 0) and your goal is to reach the bottom‐right cell (m - 1, n - 1). + * There are two types of moves available: + * Normal move: You can move right or down from your current cell (i, j), i.e. you can move to (i, j + 1) (right) or (i + 1, j) (down). The cost is the value of the destination cell. + * Teleportation: You can teleport from any cell (i, j), to any cell (x, y) such that grid[x][y] <= grid[i][j]; the cost of this move is 0. You may teleport at most k times. + * Return the minimum total cost to reach cell (m - 1, n - 1) from (0, 0). + *   + * Example 1: + * Input: grid = [[1,3,3],[2,5,4],[4,3,5]], k = 2 + * Output: 7 + * Explanation: + * Initially we are at (0, 0) and cost is 0. + * Current Position + * Move + * New Position + * Total Cost + * (0, 0) + * Move Down + * (1, 0) + * 0 + 2 = 2 + * (1, 0) + * Move Right + * (1, 1) + * 2 + 5 = 7 + * (1, 1) + * Teleport to (2, 2) + * (2, 2) + * 7 + 0 = 7 + * The minimum cost to reach bottom-right cell is 7. + * Example 2: + * Input: grid = [[1,2],[2,3],[3,4]], k = 1 + * Output: 9 + * Explanation: + * Initially we are at (0, 0) and cost is 0. + * Current Position + * Move + * New Position + * Total Cost + * (0, 0) + * Move Down + * (1, 0) + * 0 + 2 = 2 + * (1, 0) + * Move Right + * (1, 1) + * 2 + 3 = 5 + * (1, 1) + * Move Down + * (2, 1) + * 5 + 4 = 9 + * The minimum cost to reach bottom-right cell is 9. + *   + * Constraints: + * 2 <= m, n <= 80 + * m == grid.length + * n == grid[i].length + * 0 <= grid[i][j] <= 104 + * 0 <= k <= 10 + */ +class Solution { + fun minCost(grid: Array, k: Int): Int { + + } +} + +/** + * 打印测试结果 + */ +fun printTestResult(testName: String, passed: Boolean) { + val status = if (passed) "✓ 通过" else "✗ 失败" + println("$testName: $status") +} + +fun main() { + val solution = Solution() + + // 添加测试用例 + println("Running tests...") + +} diff --git a/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/python/3651. Minimum Cost Path with Teleportations.ipynb b/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/python/3651. Minimum Cost Path with Teleportations.ipynb new file mode 100644 index 0000000..34c1c9c --- /dev/null +++ b/flowzl/day test/20260128_3651_minimum-cost-path-with-teleportations/python/3651. Minimum Cost Path with Teleportations.ipynb @@ -0,0 +1,194 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# LeetCode每日一题 - 2026-01-28", + "", + "## 3651. Minimum Cost Path with Teleportations", + "", + "**难度:** Hard", + "", + "**标签:** Array, Dynamic Programming, Matrix", + "", + "---", + "", + "### 题目描述", + "", + "

You are given a m x n 2D integer array grid and an integer k. You start at the top-left cell (0, 0) and your goal is to reach the bottom‐right cell (m - 1, n - 1).

", + "", + "

There are two types of moves available:

", + "", + "
    ", + "\t
  • ", + "\t

    Normal move: You can move right or down from your current cell (i, j), i.e. you can move to (i, j + 1) (right) or (i + 1, j) (down). The cost is the value of the destination cell.

    ", + "\t
  • ", + "\t
  • ", + "\t

    Teleportation: You can teleport from any cell (i, j), to any cell (x, y) such that grid[x][y] <= grid[i][j]; the cost of this move is 0. You may teleport at most k times.

    ", + "\t
  • ", + "
", + "", + "

Return the minimum total cost to reach cell (m - 1, n - 1) from (0, 0).

", + "", + "

 

", + "

Example 1:

", + "", + "
", + "

Input: grid = [[1,3,3],[2,5,4],[4,3,5]], k = 2

", + "", + "

Output: 7

", + "", + "

Explanation:

", + "", + "

Initially we are at (0, 0) and cost is 0.

", + "", + "", + "\t", + "\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t", + "\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t", + "\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t", + "\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t", + "\t", + "
Current PositionMoveNew PositionTotal Cost
(0, 0)Move Down(1, 0)0 + 2 = 2
(1, 0)Move Right(1, 1)2 + 5 = 7
(1, 1)Teleport to (2, 2)(2, 2)7 + 0 = 7
", + "", + "

The minimum cost to reach bottom-right cell is 7.

", + "
", + "", + "

Example 2:

", + "", + "
", + "

Input: grid = [[1,2],[2,3],[3,4]], k = 1

", + "", + "

Output: 9

", + "", + "

Explanation:

", + "", + "

Initially we are at (0, 0) and cost is 0.

", + "", + "", + "\t", + "\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t", + "\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t", + "\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t", + "\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t\t", + "\t\t", + "\t", + "
Current PositionMoveNew PositionTotal Cost
(0, 0)Move Down(1, 0)0 + 2 = 2
(1, 0)Move Right(1, 1)2 + 3 = 5
(1, 1)Move Down(2, 1)5 + 4 = 9
", + "", + "

The minimum cost to reach bottom-right cell is 9.

", + "
", + "", + "

 

", + "

Constraints:

", + "", + "
    ", + "\t
  • 2 <= m, n <= 80
  • ", + "\t
  • m == grid.length
  • ", + "\t
  • n == grid[i].length
  • ", + "\t
  • 0 <= grid[i][j] <= 104
  • ", + "\t
  • 0 <= k <= 10
  • ", + "
", + "", + "", + "---", + "", + "### 解题思路", + "", + "(请在这里写下你的解题思路)", + "", + "---", + "", + "### 时间复杂度分析", + "", + "- 时间复杂度:", + "- 空间复杂度:", + "", + "---", + "", + "### 参考链接", + "- 题目链接: https://leetcode.com/problems/minimum-cost-path-with-teleportations/", + "- 相关话题: https://leetcode.com/tag/array/, https://leetcode.com/tag/dynamic-programming/, https://leetcode.com/tag/matrix/", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class Solution:", + " def minCost(self, grid: List[List[int]], k: int) -> int:", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 测试代码\n", + "def test():\n", + " solution = Solution()\n", + " # 添加测试用例\n", + " print(\"测试通过\" if ... else \"测试失败\")\n", + "\n", + "test()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file diff --git a/flowzl/day_import.py b/flowzl/day_import.py new file mode 100644 index 0000000..543e185 --- /dev/null +++ b/flowzl/day_import.py @@ -0,0 +1,493 @@ +import requests +import json +import datetime +import re +import sys +import argparse +from pathlib import Path + +def fetch_daily_leetcode_question(): + """ + 获取LeetCode每日一题 + 使用官方GraphQL API + """ + # GraphQL查询 + graphql_query = { + "query": """ + query questionOfToday { + activeDailyCodingChallengeQuestion { + date + link + question { + questionId + questionFrontendId + title + titleSlug + difficulty + content + codeSnippets { + lang + langSlug + code + } + topicTags { + name + slug + } + } + } + } + """ + } + + headers = { + "Content-Type": "application/json", + } + + try: + response = requests.post( + "https://leetcode.com/graphql", + json=graphql_query, + headers=headers + ) + response.raise_for_status() + data = response.json() + + if "errors" in data: + print("获取失败:", data["errors"]) + return None + + return data["data"]["activeDailyCodingChallengeQuestion"] + except Exception as e: + print(f"获取题目失败: {e}") + return None + +def fetch_question_by_slug(title_slug): + """ + 根据titleSlug获取题目详细信息 + """ + graphql_query = { + "query": """ + query questionData($titleSlug: String!) { + question(titleSlug: $titleSlug) { + questionId + questionFrontendId + title + titleSlug + difficulty + content + codeSnippets { + lang + langSlug + code + } + topicTags { + name + slug + } + } + } + """, + "variables": { + "titleSlug": title_slug + } + } + + headers = { + "Content-Type": "application/json", + } + + try: + response = requests.post( + "https://leetcode.com/graphql", + json=graphql_query, + headers=headers + ) + response.raise_for_status() + data = response.json() + + if "errors" in data: + print("获取失败:", data["errors"]) + return None + + return data["data"]["question"] + except Exception as e: + print(f"获取题目失败: {e}") + return None + +def search_question_by_id(question_id): + """ + 根据题号搜索题目获取titleSlug + """ + graphql_query = { + "query": """ + query problemsetQuestionList($filters: QuestionListFilterInput) { + problemsetQuestionList: questionList( + categorySlug: "" + limit: 10 + filters: $filters + ) { + total: totalNum + data { + questionFrontendId + titleSlug + } + } + } + """, + "variables": { + "filters": { + "searchKeywords": str(question_id) + } + } + } + + headers = { + "Content-Type": "application/json", + } + + try: + response = requests.post( + "https://leetcode.com/graphql", + json=graphql_query, + headers=headers + ) + response.raise_for_status() + data = response.json() + + if "errors" in data: + print("搜索失败:", data["errors"]) + return None + + questions = data["data"]["problemsetQuestionList"]["data"] + # 精确匹配题号 + for q in questions: + if q["questionFrontendId"] == str(question_id): + return q["titleSlug"] + + print(f"未找到题号为 {question_id} 的题目") + return None + except Exception as e: + print(f"搜索题目失败: {e}") + return None + +def get_code_snippet(question, lang_slug): + """获取指定语言的代码片段""" + for snippet in question.get("codeSnippets", []): + if snippet["langSlug"] == lang_slug: + return snippet["code"] + return None + +def remove_html_tags(text): + """简单的移除HTML标签""" + if not text: + return "" + return re.sub(r'<[^>]+>', '', text) + +def create_cpp_files(cpp_dir, question): + """创建C++项目文件""" + # 创建src目录 + src_dir = cpp_dir / "src" + src_dir.mkdir(exist_ok=True) + + # 1. 创建 CMakeLists.txt + cmake_content = """cmake_minimum_required(VERSION 3.10) +project(LeetCode_Solution) + +set(CMAKE_CXX_STANDARD 17) + +add_executable(Solution src/main.cpp) +""" + with open(cpp_dir / "CMakeLists.txt", 'w', encoding='utf-8') as f: + f.write(cmake_content) + + # 2. 创建 main.cpp + code_snippet = get_code_snippet(question, "cpp") or "// No C++ snippet found" + + main_cpp_content = f"""#include +#include +#include +#include +#include +#include + +using namespace std; + +{code_snippet} + +int main() {{ + Solution solution; + // 在这里添加测试用例 + cout << "Running tests..." << endl; + return 0; +}} +""" + with open(src_dir / "main.cpp", 'w', encoding='utf-8') as f: + f.write(main_cpp_content) + +def create_kotlin_files(kotlin_dir, question): + """创建Kotlin项目文件""" + code_snippet = get_code_snippet(question, "kotlin") or """class Solution { + // TODO: Implementation +}""" + + clean_content = remove_html_tags(question.get('content', '')) + + # 简单的格式化描述文本,每行不超过80字符(可选,这里简单处理换行) + desc_lines = [] + for line in clean_content.split('\n'): + if line.strip(): + desc_lines.append(f" * {line.strip()}") + formatted_desc = "\n".join(desc_lines) + + kotlin_content = f"""/** + * LeetCode 解题模板 + */ + +/** + * {question['questionFrontendId']}. {question['title']} + * +{formatted_desc} + */ +{code_snippet} + +/** + * 打印测试结果 + */ +fun printTestResult(testName: String, passed: Boolean) {{ + val status = if (passed) "✓ 通过" else "✗ 失败" + println("$testName: $status") +}} + +fun main() {{ + val solution = Solution() + + // 添加测试用例 + println("Running tests...") + +}} +""" + with open(kotlin_dir / "Solution.kt", 'w', encoding='utf-8') as f: + f.write(kotlin_content) + +def create_ipynb_from_question(question_data): + """ + 根据题目数据创建Jupyter Notebook + """ + if not question_data: + return None + + question = question_data["question"] + + # 创建Markdown内容 + date_str = question_data.get('date', datetime.datetime.now().strftime("%Y-%m-%d")) + link = question_data.get('link', f"/problems/{question.get('titleSlug', '')}") + + markdown_content = f"""# LeetCode每日一题 - {date_str} + +## {question['questionFrontendId']}. {question['title']} + +**难度:** {question['difficulty']} + +**标签:** {', '.join([tag['name'] for tag in question.get('topicTags', [])])} + +--- + +### 题目描述 + +{question['content']} + +--- + +### 解题思路 + +(请在这里写下你的解题思路) + +--- + +### 时间复杂度分析 + +- 时间复杂度: +- 空间复杂度: + +--- + +### 参考链接 +- 题目链接: https://leetcode.com{link} +- 相关话题: {', '.join([f"https://leetcode.com/tag/{tag['slug']}/" for tag in question.get('topicTags', [])])} +""" + + # 查找Python代码片段 + python_code = "" + for snippet in question.get("codeSnippets", []): + if snippet["langSlug"] == "python3": + python_code = snippet["code"] + break + + if not python_code: + python_code = """class Solution: + def solve(self) -> None: + # 在这里实现你的解决方案 + pass + +# 测试用例 +if __name__ == "__main__": + solution = Solution() + # 添加测试代码 +""" + + # 构建Jupyter Notebook结构 + notebook = { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": markdown_content.split('\n') + }, + { + "cell_type": "code", + "execution_count": None, + "metadata": {}, + "outputs": [], + "source": python_code.split('\n') + }, + { + "cell_type": "code", + "execution_count": None, + "metadata": {}, + "outputs": [], + "source": [ + "# 测试代码\n", + "def test():\n", + " solution = Solution()\n", + " # 添加测试用例\n", + " print(\"测试通过\" if ... else \"测试失败\")\n", + "\n", + "test()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 + } + + return notebook + +def save_time_problem(question_data): + """ + 保存题目辅助函数 + """ + # 创建notebook + notebook = create_ipynb_from_question(question_data) + + if notebook: + # 获取日期和题目信息 + # 如果是每日一题,使用API返回的日期;如果是指定题目,使用当前日期 + date_str = question_data.get("date", datetime.datetime.now().strftime("%Y-%m-%d")).replace("-", "") + # 如果格式不是YYYYMMDD,尝试转换或就用当前日期 + if len(date_str) != 8: + date_str = datetime.datetime.now().strftime("%Y%m%d") + + question = question_data["question"] + q_id = question["questionFrontendId"] + title_slug = question.get("titleSlug", "unknown") + title = question["title"] + + # 构建文件夹名称: 日期_题号_title + folder_name = f"{date_str}_{q_id}_{title_slug}" + + # 确定基础目录 + base_dir = Path(__file__).parent / "day test" + target_dir = base_dir / folder_name + + # 创建所需的子文件夹 + cpp_dir = target_dir / "c++" + kotlin_dir = target_dir / "kotlin" + python_dir = target_dir / "python" + + for d in [cpp_dir, kotlin_dir, python_dir]: + d.mkdir(parents=True, exist_ok=True) + + # 创建 C++ 文件 + try: + create_cpp_files(cpp_dir, question) + print("✓ C++ 文件已创建") + except Exception as e: + print(f"✗ 创建 C++ 文件失败: {e}") + + # 创建 Kotlin 文件 + try: + create_kotlin_files(kotlin_dir, question) + print("✓ Kotlin 文件已创建") + except Exception as e: + print(f"✗ 创建 Kotlin 文件失败: {e}") + + # 生成notebook文件名 + # 移除非法字符 + safe_title = "".join([c for c in title if c not in '<>:"/\\|?*']) + filename = f"{q_id}. {safe_title}.ipynb" + file_path = python_dir / filename + + # 保存文件 + with open(file_path, 'w', encoding='utf-8') as f: + json.dump(notebook, f, ensure_ascii=False, indent=2) + + print(f"✓ 目录已创建: {target_dir}") + print(f"✓ 文件已保存: {file_path}") + print(f"题目: {title}") + print(f"难度: {question['difficulty']}") + + return str(file_path) + else: + print("✗ 创建文件失败") + return None + +def save_daily_question(question_id=None): + """ + 主函数:获取题目并保存 + :param question_id: 可选,指定题号。如果为None,则获取每日一题。 + """ + if question_id: + print(f"正在获取第 {question_id} 题...") + title_slug = search_question_by_id(question_id) + if not title_slug: + return None + + question = fetch_question_by_slug(title_slug) + if not question: + print("获取题目详情失败") + return None + + question_data = { + "date": datetime.datetime.now().strftime("%Y-%m-%d"), + "link": f"/problems/{title_slug}", + "question": question + } + else: + print("正在获取LeetCode每日一题...") + question_data = fetch_daily_leetcode_question() + + if not question_data: + print("获取题目失败") + return None + + return save_time_problem(question_data) + +# 执行 +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='LeetCode 题目下载工具') + parser.add_argument('-id', '--question_id', type=str, help='指定下载的题号') + args = parser.parse_args() + + save_daily_question(args.question_id) \ No newline at end of file