【ARTS】【LeetCode-704】二分查找算法
目录
前言
什么是ARTS?
算法
力扣704题
二分查找
基本思想:
二分查找算法(递归的方式):
经典写法(找单值):
代码分析:
经典写法(找数组即多个返回值)
代码分析
经典题目
题目描述:
官方题解
深入思考
模版一 (相错终止/左闭右闭)
相等返回情形
情形1 (大于等于)
情形2 (大于)
情形3 (小于等于)
情形4 (小于)
模版二 (相等终止/左闭右开)
相等返回情形
情形1 (大于等于)
情形2 (大于)
情形3 (小于等于)
情形4 (小于)
从「y总模版」到「模版二」之「左开右闭」
相等返回情形
情形1 (大于等于)
情形2 (大于)
情形3 (小于等于)
情形4 (小于)
模版三 (相邻终止/左开右开)
相等返回情形
情形1 (大于等于)
情形2 (大于)
情形3 (小于等于)
情形4 (小于)
参考资料:
前言
仅做学习使用,侵删
什么是ARTS?
算法(Algorithm): 每周至少一道LeetCode算法题,加强编程训练和算法学习
阅读(Review): 阅读并点评至少一篇英文技术文章,提高英文水平
技巧 (Tip):学习至少一个技术技巧,总结、归纳日常工作中遇到的知识点
分享(Share):分析一篇有关点和思考的技术文章,建立影响力,输出价值观
算法
力扣704题
一道经典的二分查找题目
链接:704. 二分查找 - 力扣(LeetCode)
二分查找
基本思想:
二分查找算法(递归的方式):
- 创建一个查找算法,参数列表有left,right,findValue,array
- 创建一个变量mid,通过left和right获取mid
- 通过对mid的比较,决定递归方向
- 最后判断是否能找到
请注意,所有的二分查找算法都是建立在数组有序的基础上的,如果带查找序列是无序序列,不能用二分查找算法,只能使用其他查找算法,谨记!
经典写法(找单值):
public static int binarySearchSingle(int[] array,int left,int right,int findValue) {if(left > right || findValue > array[length-1]) {return -1;}var mid = left + 1/2*(right - left);var midValue = array[mid];if(findValue > midValue) {return binarySearchSingle(array,mid+1,right,findValue);}else if(findValue < midValue) {return binarySearchSingle(array,left,mid-1,findValue);}else {return mid;}} 代码分析:
- left是左索引,right是右索引,应该一开始就被赋值为0与array.length-1(因为带查找的值在他们两个索引之间,即
[left,right]区间内有带查找元素) - findValue是待查找的值,array是带查找的数组
- 二分查找法顾名思义是折半,所以
mid = 1/2(left + right) = left + 1/2*(right - left)
注意:后面的表达式非常的重要,是折半查找发的关键
- 将mid下标对应的值放入midValue
情况:
- 如果midValue大于findValue,由于有序,说明待查找的元素在mid右边且不为mid,所以得出了[mid+1,right]的范围内有带查找元素,故left = mid+1
- 如果midVvalue小于findValue,由于有序,说明带查找的元素在mid左边且不为mid,所以得出了[left,mid-1]的范围内有带查找元素,故right = mid-1
- 如果midValue = findValue,说明找到了该元素,直接返回mid即可,mid是下标
- 如果left > right,由于没有这样的区间(即区间左边必须小于右边的值),说明找不到,直接返回-1
- 如果findValue大于列表的最后一个值,由于有序,最后一个值为最大值,说明列表里面不可能有与findValue相同的值,直接返回-1
经典写法(找数组即多个返回值)
public static List<Integer> binarySearchMore(int[] array,int left,int right,int findValue) {if(left > right || findValue > array[length-1]) {return new ArrayList<Integer>();}var mid = (left + right)/2;var midValue = array[mid];if(findValue > midValue) {return binarySearchMore(array,mid+1,right,findValue);}else if(findValue < midValue) {return binarySearchMore(array,left,mid-1,findValue);}else {var list = new ArrayList<Integer>();list.add(mid);var temp = mid - 1;while(temp > 0 && array[temp] == findValue) {list.add(temp--);}temp = mid + 1;while (temp < array.length && array[temp] == findValue) {list.add(temp++);}return list;} 代码分析
- 注意:由于其他代码都一样,我们重点分析一下else里面的代码
- 当程序进入else时,说明找到了该元素,由于我们要实现多元素返回,我们可以借助集合,故我们要new一个ArrayLsit<Integer>
- 先将该元素add进去集合中
- 创建一个辅助索引temp,赋值为mid-1(目的:向左遍历)
- 通过while循环,如果temp>0(防止数组下标越界异常),且array[temp] = findValue,说明此元素也是我们要找的元素,添加入集合中
- 如果while布尔表达式为false,说明temp遍历到了最左边或是不相等,由于列表的有序性,如果不相等,则前面的元素一定比midValue小,不可能再有带查找的元素,直接结束向左遍历
- temp赋值为mid+1(目的:向右遍历)
- 同理5~6
- 最后返回list即可
- 特别注意的是,如果找不到,我们返回一个空的集合,所以在最前面new了一个空集合
经典题目
题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1提示:你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。 官方题解
class Solution {public int search(int[] nums, int target) {int left = 0,right = nums.length - 1;while (left <= right){int mid = (right - left) / 2 +left;int num = nums[mid];if (num == target) {return mid;} else if (num > target) {right = mid - 1;} else {left = mid + 1;}}return -1;}
} 深入思考
二分查找本身思想比较简单,但是实际上二分查找在编写的过程中会出现各种各样的问题,如无限循环等,针对这道题可能会不会有这种问题。特别是根据上下边界指针的循环确定问题。下面给出四种情形下的模版参考,每一种模版下又分为四种情况
以下资料参考 二分查找从入门到入睡 - 力扣(LeetCode)推荐去阅读原文,这里只是做摘录,给出对应情况的模版,具体分析参考原文,也可点击对应的模版链接直接跳转。
作者:yukiyama
链接: https://leetcode.cn/circle/discuss/ooxfo8/
来源:力扣(LeetCode)
模版一 (相错终止/左闭右闭)
相等返回情形
// 模版一「相等返回」写法
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length - 1;while(l <= r){ // 循环条件int c = l + (r - l) / 2; // 中间值坐标if(nums[c] == target) return c; // 相等返回else if(nums[c] < target) l = c + 1; // #1 更新后l左侧元素「必」小于targetelse r = c - 1; // #2 更新后r右侧元素「必」大于target }return -1; }
} 情形1 (大于等于)
// 模版一「一般」情形1: 大于等于
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length - 1;while(l <= r){int c = l + (r - l) / 2;if(nums[c] < target) l = c + 1; // #1 更新后l左侧元素「必」小于targetelse r = c - 1; // #2 更新后r右侧「必」大于等于target}// return (l == nums.length || nums[l] != target) ? -1 : l; // 704题的返回,处理:相等/不等return l == nums.length ? -1 : l; // 处理: 相等/刚好大于/不存在}
} 情形2 (大于)
// 模版一「一般」情形2: 大于
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length - 1;while(l <= r){int c = l + (r - l) / 2;if(nums[c] <= target) l = c + 1; // #1 更新后l左侧元素「必」小于等于targetelse r = c - 1; // #2 更新后r右侧「必」大于target}return l == nums.length ? -1 : l; // 处理: 刚好大于/不存在}
} 情形3 (小于等于)
// 模版一「一般」情形3: 小于等于
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length - 1;while(l <= r){int c = l + (r - l) / 2;if(nums[c] <= target) l = c + 1; // #1 更新后l左侧「必」小于等于targetelse r = c - 1; // #2 更新后r右侧「必」大于target}// return (r == -1 || nums[r] != target) ? -1 : r; // 704题的返回,处理:相等/不等return r; // 处理: 相等/刚好小于/不存在}
} 情形4 (小于)
// 模版一「一般」情形4: 小于
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length - 1;while(l <= r){int c = l + (r - l) / 2;if(nums[c] < target) l = c + 1; // #1 更新后l左侧元素「必」小于targetelse r = c - 1; // #2 更新后r右侧「必」大于等于target}return r; // 处理: 相等/刚好小于/不存在}
} 模版二 (相等终止/左闭右开)
相等返回情形
// 模版二「相等返回」写法
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length;while(l < r){int c = l + (r - l) / 2;if(nums[c] == target) return c; // 找到目标值直接返回else if(nums[c] < target) l = c + 1; // #1 更新后l左侧元素「必」小于target else r = c; // nums[c] > target #2 更新后r及其右侧「必」大于target}return -1;}
} 情形1 (大于等于)
// 模版二「一般」情形1: 大于等于
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length;while(l < r){int c = l + (r - l) / 2;if(nums[c] < target) l = c + 1; // #1 更新后l左侧元素「必」小于target else r = c; // #2 更新后r及r右侧「必」大于等于target}// return (r != nums.length && nums[r] == target) ? r : -1; // 704题的返回,处理:相等/不等return r != nums.length ? r : -1; // 处理:等于/刚好大于/不存在}
} 情形2 (大于)
// 模版二「一般」情形2: 大于
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length;while(l < r){int c = l + (r - l) / 2;if(nums[c] <= target) l = c + 1; // #1 更新后l左侧「必」小于等于target else r = c; // #2 更新后r及其右侧「必」大于target}return r == nums.length ? -1 : r; // 处理:刚好大于/不存在}
} 情形3 (小于等于)
// 模版二「一般」写法之情形3(正确版2)
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length;while(l < r){int c = l + (r - l) / 2;if(nums[c] <= target) l = c + 1; // #1 更新后l左侧元素「必」小于等于target else r = c; // #2 更新后r及其右侧「必」大于target}// 原先针对 704 的返回有漏洞,该修改(下面一行)来自 Hankai Xia @masterx89 同学,感谢// return (r > 0 && nums[r - 1] == target) ? r - 1 : -1; // 704题的返回,处理:相等/不等// return r - 1; // 通过分析target的三种情形得到的统一返回值return r > 0 ? r - 1 : -1; // 但写成此种形式,逻辑更佳 (来自Hankai Xia @masterx89 的建议)}
} 情形4 (小于)
// 模版二「一般」情形4: 小于
class Solution {public int search(int[] nums, int target) {int l = 0, r = nums.length;while(l < r){int c = l + (r - l) / 2;if(nums[c] < target) l = c + 1; // #1 更新后l左侧元素「必」小于target else r = c; // #2 更新后r及其右侧「必」大于等于target}return r - 1; // 处理:刚好小于/不存在}
}作者:yukiyama
链接:https://leetcode.cn/circle/discuss/ooxfo8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 从「y总模版」到「模版二」之「左开右闭」
相等返回情形
// 模版二(左开右闭)相等返回情形
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length - 1;while(l < r){int c = l + (r - l + 1) / 2;if(nums[c] == target) return c;if(nums[c] < target) l = c; // #1 更新后l及l左侧元素「必」小于target else r = c - 1; // #2 更新后r右侧「必」大于target}return -1; // 704题的返回}
} 情形1 (大于等于)
// 模版二(左开右闭)「一般」情形1(大于等于)
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length - 1;while(l < r){int c = l + (r - l + 1) / 2;if(nums[c] < target) l = c; // #1 更新后l及l左侧元素「必」小于target else r = c - 1; // #2 更新后r右侧「必」大于等于target}// return (r == nums.length - 1 || nums[r + 1] != target) ? -1 : r + 1; // 704题的返回,处理:相等/不等return r == nums.length - 1 ? -1 : r + 1;}
} 情形2 (大于)
// 模版二(左开右闭)「一般」情形2(大于)
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length - 1;while(l < r){int c = l + (r - l + 1) / 2;if(nums[c] <= target) l = c; // #1 更新后l及l左侧元素「必」小于等于target else r = c - 1; // #2 更新后r右侧「必」大于target}return r == nums.length ? -1 : r + 1;}
} 情形3 (小于等于)
// 模版二(左开右闭)「一般」情形3(小于等于)
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length - 1;while(l < r){int c = l + (r - l + 1) / 2;if(nums[c] <= target) l = c; // #1 更新后l及l左侧元素「必」小于等于target else r = c - 1; // #2 更新后r右侧「必」大于target}// return (l == -1 || nums[l] != target) ? -1 : l; // 704题的返回,处理:相等/不等return l;}
} 情形4 (小于)
// 模版二(左开右闭)「一般」情形4(小于)
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length - 1;while(l < r){int c = l + (r - l + 1) / 2;if(nums[c] < target) l = c; // #1 更新后l及l左侧元素「必」小于target else r = c - 1; // #2 更新后r右侧「必」大于等于target}return l;}
} 模版三 (相邻终止/左开右开)
相等返回情形
// 模版三「相等返回」写法
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length;while(l + 1 < r){int c = l + (r - l) / 2;if(nums[c] == target) return c; // 找到目标值直接返回else if(nums[c] < target) l = c; // #1 更新后l及其左侧元素「必」小于target else r = c; // nums[c] > target #2 更新后r及其右侧「必」大于target}return -1;}
} 情形1 (大于等于)
// 模版三「一般」情形1: 大于等于
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length;while(l + 1 < r){int c = l + (r - l) / 2;if(nums[c] < target) l = c; // #1 更新后l及其左侧元素「必」小于targetelse r = c; // #2 更新后r及其右侧「必」大于等于target}// return (r == nums.length || nums[r] != target) ? -1 : r; // 704题的返回,处理:相等/不等return r == nums.length ? -1 : r; // 处理: 相等/刚好大于/不存在}
} 情形2 (大于)
// 模版三「一般」情形2: 大于
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length;while(l + 1 < r){int c = l + (r - l) / 2;if(nums[c] <= target) l = c; // #1 更新后l及其左侧元素「必」小于等于targetelse r = c; // #2 更新后r及其右侧「必」大于target}return r == nums.length ? -1 : r; // 处理: 相等/刚好大于/不存在}
} 情形3 (小于等于)
// 模版三「一般」情形1: 大于等于
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length;while(l + 1 < r){int c = l + (r - l) / 2;if(nums[c] < target) l = c; // #1 更新后l及其左侧元素「必」小于targetelse r = c; // #2 更新后r及其右侧「必」大于等于target}// return (r == nums.length || nums[r] != target) ? -1 : r; // 704题的返回,处理:相等/不等return r == nums.length ? -1 : r; // 处理: 相等/刚好大于/不存在}
} 情形4 (小于)
// 模版三「一般」情形4: 小于
class Solution {public int search(int[] nums, int target) {int l = -1, r = nums.length;while(l + 1 < r){int c = l + (r - l) / 2;if(nums[c] < target) l = c; // #1 更新后l及其左侧元素「必」小于targetelse r = c; // #2 更新后r及其右侧「必」大于等于target}return l;}
} 拿到题目可以直接对题目进行分析,按照情形套用对应的模板
下面是一些题目
本节给出如下二分查找题目,在理解本文内容后,应当不难做出。「题解」一列中给出了相应的题解以供读者自查。
704. 二分查找简单题解
69. x 的平方根简单题解
374. 猜数字大小简单题解
剑指 Offer 53 - II. 0~n-1中缺失的数字简单题解
33. 搜索旋转排序数组中等题解
153. 寻找旋转排序数组中的最小值中等题解
154. 寻找旋转排序数组中的最小值 II困难题解
81. 搜索旋转排序数组 II中等题解
278. 第一个错误的版本简单题解
162. 寻找峰值中等题解
34. 在排序数组中查找元素的第一个和最后一个位置中等题解
35. 搜索插入位置简单题解
74. 搜索二维矩阵中等题解
658. 找到 K 个最接近的元素中等题解
29. 两数相除中等题解
875. 爱吃香蕉的珂珂中等题解
668. 乘法表中第k小的数困难题解
462. 最少移动次数使数组元素相等 II中等题解
436. 寻找右区间中等题解
528. 按权重随机选择中等题解
497. 非重叠矩形中的随机点中等题解
240. 搜索二维矩阵 II中等题解
4. 寻找两个正序数组的中位数困难题解
参考资料:
- 二分查找从入门到入睡 - 力扣(LeetCode)
- 代码随想录
- 704. 二分查找 - 力扣(LeetCode)
相关文章:
【ARTS】【LeetCode-704】二分查找算法
目录 前言 什么是ARTS? 算法 力扣704题 二分查找 基本思想: 二分查找算法(递归的方式): 经典写法(找单值): 代码分析: 经典写法(找数组即多个返回值) 代码分析 经典题目 题目描述: 官方题解 深入思考 模版一 (相错终止/左闭右闭) 相等返回情形…...
Vue.js 配置路由:基本的路由匹配
Vue.js 配置路由:基本的路由匹配 在 Vue.js 应用中,Vue Router 是官方提供的路由管理器,用于在单页应用(SPA)中管理不同的视图。通过配置路由,应用可以根据 URL 的变化展示相应的组件。 基本的路由匹配是…...
鸿蒙(HarmonyOS)Json格式转实体对象(2)
下面是一个复杂的json体。 怎么把json转实体类,首先要定义类 import List from ohos.util.List export class InfoModel{msg: stringcars: List<Cars>code: numberpermissions: List<string>roles: List<string>user: User}class Cars{createBy:…...
代码随想录 栈与队列 test 6
239. 滑动窗口最大值 - 力扣(LeetCode) 每次只取窗口中最大值,这个最大值可能在后面的滑动中保持不变,而比最大值小的值且在最大值之前出现的值没必要保留,因此可以通过单调队列利用这个特性。 这个单调队列具有如下…...
动手学深度学习2025.1.23
一、预备知识 1.数据操作 (1)数据访问: 一个元素:[1,2] //行下标为1,列下标为2的元素 一行元素:[1,:] //行下标为1的所有元素 一列元素:[:,1] //列下标为1的所有元素 子区域:[…...
生存网络与mlr3proba
在R语言中,mlr3包是一个用于机器学习的强大工具包。它提供了一种简单且灵活的方式来执行超参数调整。 生存网络是一种用于生存分析的模型,常用在医学和生物学领域。生存分析是一种统计方法,用于研究事件发生的时间和相关因素对事件发生的影响。生存网络可以用来预测个体在给…...
C#与AI的共同发展
C#与人工智能(AI)的共同发展反映了编程语言随着技术进步而演变,以适应新的挑战和需要。自2000年微软推出C#以来,这门语言经历了多次迭代,不仅成为了.NET平台的主要编程语言之一,还逐渐成为构建各种类型应用程序的强大工具。随着时…...
2000-2020年各省第二产业增加值数据
2000-2020年各省第二产业增加值数据 1、时间:2000-2020年 2、来源:国家统计局、统计年鉴、各省年鉴 3、指标:行政区划代码、地区、年份、第二产业增加值 4、范围:31省 5、指标解释:第二产业增加值是指在一个国家或…...
【MySQL】 库的操作
欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 库的操作 发布时间:2025.1.23 隶属专栏:MySQL 目录 库的创建语法使用 编码规则认识编码集查看数据库默认的编码集和校验集查看数据库支持的编码集和校验集指定编码创建数据库验证不…...
docker 启动镜像命令集合
安装rabbitmq 参考地址: https://blog.csdn.net/xxpxxpoo8/article/details/122935994 docker run -it -d --namerabbit-3.8 -v /d/docker/rabbitmq-stomp/conf:/etc/rabbitmq -p 5617:5617 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:2…...
微信小程序获取位置服务
wx.getLocation({type: gcj02,success(res) {wx.log(定位成功);},fail(err) {wx.log(定位失败, err);wx.showModal({content: 请打开手机和小程序中的定位服务,success: (modRes) > {if (modRes.confirm) {wx.openSetting({success(setRes) {if (setRes.authSetting[scope.u…...
Docker Load后存储的镜像及更改镜像存储目录的方法
Docker Load后存储的镜像及更改镜像存储目录的方法 Docker Load后存储的镜像更改镜像存储目录的方法脚本说明注意事项Docker作为一种开源的应用容器引擎,已经广泛应用于软件开发、测试和生产环境中。通过Docker,开发者可以将应用打包成镜像,轻松地进行分发和运行。而在某些场…...
Langchain本地知识库部署
本地部署(Docker + LangChain + FAISS) 1. 概述 本地部署 LangChain-Chatchat 可以为企业提供高效、安全、可控的 AI 知识库方案。本方案基于 Docker、LangChain 和 FAISS 进行本地化部署,适用于企业内部知识库问答、私有化 AI 应用等场景。 2. 技术选型 2.1 LangChain …...
java基础学习——jdbc基础知识详细介绍
引言 数据的存储 我们在开发 java 程序时,数据都是存储在内存中的,属于临时存储,当程序停止或重启时,内存中的数据就会丢失,我们为了解决数据的长期存储问题,有以下解决方案: 通过 IO流书记&…...
联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)
有很多网友问联想电脑怎么设置u盘启动,联想电脑设置u盘启动的方法有两种,一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是,一种是uefi引导,一种是传统的leacy引导,所以需要注意制…...
C# 解析 HTML 实战指南
在网页开发和数据处理的场景中,经常需要从 HTML 文档里提取有用的信息。C# 作为一门强大的编程语言,提供了丰富的工具和库来实现 HTML 的解析。这篇博客就带你深入了解如何使用 C# 高效地解析 HTML。 一、为什么要在 C# 中解析 HTML 在实际项目中&…...
光谱相机在智能冰箱的应用原理与优势
食品新鲜度检测 详细可点击查看汇能感知团队实验报告:高光谱成像技术检测食物新鲜度 检测原理:不同新鲜程度的食品,其化学成分和结构会有所不同,在光谱下的反射、吸收等特性也存在差异。例如新鲜肉类和蔬菜中的水分、蛋白质、叶…...
编写0号中断的处理程序
实验内容、程序清单及运行结果 编写0号中断的处理程序(课本实验12) 解: assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例…...
“““【运用 R 语言里的“predict”函数针对 Cox 模型展开新数据的预测以及推理。】“““
主题与背景 本文主要介绍了如何在R语言中使用predict函数对已拟合的Cox比例风险模型进行新数据的预测和推理。Cox模型是一种常用的生存分析方法,用于评估多个因素对事件发生时间的影响。文章通过具体的代码示例展示了如何使用predict函数的不同参数来获取生存概率和…...
群晖docker获取私有化镜像http: server gave HTTP response to HTTPS client].
群晖docker获取私有化镜像提示http: server gave HTTP response to HTTPS clien 问题描述 层级时间用户事件Information2023/07/08 12:47:45cxlogeAdd image from xx.xx.31.240:1923/go-gitea/gitea:1.19.3Error2023/07/08 12:47:48cxlogeFailed to pull image [Get "http…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
