自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

闻缺陷则喜何志丹

本人拙作《闻缺陷则喜》欢迎指教,可在CSDN下载

  • 博客(771)
  • 资源 (86)
  • 收藏
  • 关注

原创 【贪心算法】LeetCode2071:你可以安排的最多任务数目

给你 n 个任务和 m 个工人。每个任务需要一定的力量值才能完成,需要的力量值保存在下标从 0 开始的整数数组 tasks 中,第 i 个任务需要 tasks[i] 的力量才能完成。每个工人的力量值保存在下标从 0 开始的整数数组 workers 中,第 j 个工人的力量值为 workers[j] 。每个工人只能完成 一个 任务,且力量值需要 大于等于 该任务的力量要求值(即 workers[j] >= tasks[i] )。除此以外,你还有 pills 个神奇药丸,可以给 一个工人的力量值 增加 str

2023-12-07 07:00:00 1267 116

原创 二分查找算法合集

分四类:自己写二分算法 有序映射 对有序向量二分查找 有序集合

2023-11-19 07:00:00 511 10

原创 C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例

包括4个压缩包,初始代码,实现前缀和,实现前缀积,实现前缀异或。都是在前者的基础上修改的。

2023-10-16 07:30:00 1010 15

原创 二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目

一个数组的 分数 定义为数组之和 乘以 数组的长度。比方说,[1, 2, 3, 4, 5] 的分数为 (1 + 2 + 3 + 4 + 5) * 5 = 75 。给你一个正整数数组 nums 和一个整数 k ,请你返回 nums 中分数 严格小于 k 的 非空整数子数组数目。子数组 是数组中的一个连续元素序列。

2023-12-09 07:00:00 196 7

原创 【二分查找】LeetCode:2354.优质数对的数目

给你一个下标从 0 开始的正整数数组 nums 和一个正整数 k 。如果满足下述条件,则数对 (num1, num2) 是 优质数对 :num1 和 num2 都 在数组 nums 中存在。num1 OR num2 和 num1 AND num2 的二进制表示中值为 1 的位数之和大于等于 k ,其中 OR 是按位 或 操作,而 AND 是按位 与 操作。返回 不同 优质数对的数目。如果 a != c 或者 b != d ,则认为 (a, b) 和 (c, d) 是不同的两个数对。例如,(1, 2

2023-12-09 06:45:00 26

原创 【二分查找】LeetCode2141: 同时运行 N 台电脑的最长时间

你有 n 台电脑。给你整数 n 和一个下标从 0 开始的整数数组 batteries ,其中第 i 个电池可以让一台电脑 运行 batteries[i] 分钟。你想使用这些电池让 全部 n 台电脑 同时 运行。一开始,你可以给每台电脑连接 至多一个电池 。然后在任意整数时刻,你都可以将一台电脑与它的电池断开连接,并连接另一个电池,你可以进行这个操作 任意次 。新连接的电池可以是一个全新的电池,也可以是别的电脑用过的电池。断开连接和连接新的电池不会花费任何时间。注意,你不能给电池充电。请你返回你可以让

2023-12-08 07:00:00 53 3

原创 二分查找|差分数组|LeetCode2251:花期内花的数目

给你一个下标从 0 开始的二维整数数组 flowers ,其中 flowers[i] = [starti, endi] 表示第 i 朵花的 花期 从 starti 到 endi (都 包含)。同时给你一个下标从 0 开始大小为 n 的整数数组 people ,people[i] 是第 i 个人来看花的时间。请你返回一个大小为 n 的整数数组 answer ,其中 answer[i]是第 i 个人到达时在花期内花的 数目 。

2023-12-08 06:45:00 22 1

原创 前缀和|二分查找|LeetCode2234| 花园的最大总美丽值

Alice 是 n 个花园的园丁,她想通过种花,最大化她所有花园的总美丽值。给你一个下标从 0 开始大小为 n 的整数数组 flowers ,其中 flowers[i] 是第 i 个花园里已经种的花的数目。已经种了的花 不能 移走。同时给你 newFlowers ,表示 Alice 额外可以种花的 最大数目 。同时给你的还有整数 target ,full 和 partial 。如果一个花园有 至少 target 朵花,那么这个花园称为 完善的 ,花园的 总美丽值 为以下分数之 和 :完善 花园数目乘以

2023-12-07 13:15:00 97 4

原创 【动态规划】LeetCode2111:使数组 K 递增的最少操作次数

给你一个下标从 0 开始包含 n 个正整数的数组 arr ,和一个正整数 k 。如果对于每个满足 k

2023-12-06 12:04:02 131 5

原创 [组合数学]LeetCode:2954:统计感冒序列的数目

给你一个整数 n 和一个下标从 0 开始的整数数组 sick ,数组按 升序 排序。有 n 位小朋友站成一排,按顺序编号为 0 到 n - 1 。数组 sick 包含一开始得了感冒的小朋友的位置。如果位置为 i 的小朋友得了感冒,他会传染给下标为 i - 1 或者 i + 1 的小朋友,前提 是被传染的小朋友存在且还没有得感冒。每一秒中, 至多一位 还没感冒的小朋友会被传染。经过有限的秒数后,队列中所有小朋友都会感冒。感冒序列 指的是 所有 一开始没有感冒的小朋友最后得感冒的顺序序列。请你返回所有感冒序

2023-12-06 06:45:00 131 4

原创 【滑动窗口】LeetCode2953:统计完全子字符串

给你一个字符串 word 和一个整数 k 。如果 word 的一个子字符串 s 满足以下条件,我们称它是 完全字符串:s 中每个字符 恰好 出现 k 次。相邻字符在字母表中的顺序 至多 相差 2 。也就是说,s 中两个相邻字符 c1 和 c2 ,它们在字母表中的位置相差 至多 为 2 。请你返回 word 中 完全 子字符串的数目。子字符串 指的是一个字符串中一段连续 非空 的字符序列。

2023-12-05 07:00:00 202 13

原创 【离散差分】LeetCode2953:统计完全子字符串

给你一个字符串 word 和一个整数 k 。如果 word 的一个子字符串 s 满足以下条件,我们称它是 完全字符串:s 中每个字符 恰好 出现 k 次。相邻字符在字母表中的顺序 至多 相差 2 。也就是说,s 中两个相邻字符 c1 和 c2 ,它们在字母表中的位置相差 至多 为 2 。请你返回 word 中 完全 子字符串的数目。子字符串 指的是一个字符串中一段连续 非空 的字符序列。

2023-12-05 06:45:00 34 1

原创 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积

给你两个 从小到大排好序 且下标从 0 开始的整数数组 nums1 和 nums2 以及一个整数 k ,请你返回第 k (从 1 开始编号)小的 nums1[i] * nums2[j] 的乘积,其中 0

2023-12-04 07:00:00 914 108

原创 [二分查找双指针]LeetCode881: 救生艇

给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。返回 承载所有人所需的最小船数 。

2023-12-04 06:45:00 52

原创 二分查找:LeetCode2035:将数组分成两个数组并最小化数组和的差

给你一个长度为 2 * n 的整数数组。你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之 差的绝对值 。nums 中每个元素都需要放入两个数组之一。请你返回 最小 的数组和之差。

2023-12-03 07:00:00 193 8

原创 [二分查找]LeetCode2009 :使数组连续的最少操作数

给你一个整数数组 nums 。每一次操作中,你可以将 nums 中 任意 一个元素替换成 任意 整数。如果 nums 满足以下条件,那么它是 连续的 :nums 中所有元素都是 互不相同 的。nums 中 最大 元素与 最小 元素的差等于 nums.length - 1 。比方说,nums = [4, 2, 5, 3] 是 连续的 ,但是 nums = [1, 2, 3, 5, 6] 不是连续的 。请你返回使 nums 连续 的 最少 操作次数。

2023-12-03 06:45:00 61

原创 【二分查找】LeetCode1970:你能穿过矩阵的最后一天

给你一个下标从 1 开始的二进制矩阵,其中 0 表示陆地,1 表示水域。同时给你 row 和 col 分别表示矩阵中行和列的数目。一开始在第 0 天,整个 矩阵都是 陆地 。但每一天都会有一块新陆地被 水 淹没变成水域。给你一个下标从 1 开始的二维数组 cells ,其中 cells[i] = [ri, ci] 表示在第 i 天,第 ri 行 ci 列(下标都是从 1 开始)的陆地会变成 水域 (也就是 0 变成 1 )。你想知道从矩阵最 上面 一行走到最 下面 一行,且只经过陆地格子的 最后一天

2023-12-02 07:00:00 271 10

原创 [二分查找]LeetCode1964:找出到每个位置为止最长的有效障碍赛跑路线

你打算构建一些障碍赛跑路线。给你一个 下标从 0 开始 的整数数组 obstacles ,数组长度为 n ,其中 obstacles[i] 表示第 i 个障碍的高度。对于每个介于 0 和 n - 1 之间(包含 0 和 n - 1)的下标 i ,在满足下述条件的前提下,请你找出 obstacles 能构成的最长障碍路线的长度:你可以选择下标介于 0 到 i 之间(包含 0 和 i)的任意个障碍。在这条路线中,必须包含第 i 个障碍。你必须按障碍在 obstacles 中的 出现顺序 布置这些障碍。

2023-12-02 06:45:00 57

原创 【前缀和]LeetCode1862:向下取整数对和

给你一个整数数组 nums ,请你返回所有下标对 0

2023-12-01 06:45:00 285 14

原创 【深度优先】LeetCode1932:合并多棵二叉搜索树

给你 n 个 二叉搜索树的根节点 ,存储在数组 trees 中(下标从 0 开始),对应 n 棵不同的二叉搜索树。trees 中的每棵二叉搜索树 最多有 3 个节点 ,且不存在值相同的两个根节点。在一步操作中,将会完成下述步骤:选择两个 不同的 下标 i 和 j ,要求满足在 trees[i] 中的某个 叶节点 的值等于 trees[j] 的 根节点的值 。用 trees[j] 替换 trees[i] 中的那个叶节点。从 trees 中移除 trees[j] 。如果在执行 n - 1 次操作后,能形

2023-12-01 06:45:00 132 2

原创 【动态规划】LeetCode2552:优化了6版的1324模式

给你一个长度为 n 下标从 0 开始的整数数组 nums ,它包含 1 到 n 的所有数字,请你返回上升四元组的数目。如果一个四元组 (i, j, k, l) 满足以下条件,我们称它是上升的:0

2023-11-30 07:00:00 1802 128

原创 C++二分查找算法:包含每个查询的最小区间

给你一个二维整数数组 intervals ,其中 intervals[i] = [lefti, righti] 表示第 i 个区间开始于 lefti 、结束于 righti(包含两侧取值,闭区间)。区间的 长度 定义为区间中包含的整数数目,更正式地表达是 righti - lefti + 1 。再给你一个整数数组 queries 。第 j 个查询的答案是满足 lefti

2023-11-30 06:45:00 99 1

原创 C++单调向量(栈):好子数组的最大分数

给你一个整数数组 nums (下标从 0 开始)和一个整数 k 。一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 。一个 好 子数组的两个端点下标需要满足 i

2023-11-29 07:00:00 148 5

原创 C++二分查找、离线算法:最近的房间

一个酒店里有 n 个房间,这些房间用二维整数数组 rooms 表示,其中 rooms[i] = [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。同时给你 k 个查询,用二维数组 queries 表示,其中 queries[j] = [preferredj, minSizej] 。第 j 个查询的答案是满足如下条件的房间 id :房间的面积 至少 为 minSizej ,且abs(id - pre

2023-11-29 06:45:00 93

原创 C++二分查找或并集查找:交换得到字典序最小的数组

给你一个下标从 0 开始的 正整数 数组 nums 和一个 正整数 limit 。在一次操作中,你可以选择任意两个下标 i 和 j,如果 满足 |nums[i] - nums[j]|

2023-11-28 07:00:00 145 7

原创 C++二分查找视频教程:两数之和

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1

2023-11-28 06:45:00 61

原创 利用广度优先或模拟解决米诺骨牌

n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:domin

2023-11-27 11:30:00 748 105

原创 C++前缀和算法:统计美丽子字符串

给你一个字符串 s 和一个正整数 k 。用 vowels 和 consonants 分别表示字符串中元音字母和辅音字母的数量。如果某个字符串满足以下条件,则称其为 美丽字符串 :vowels == consonants,即元音字母和辅音字母的数量相等。(vowels * consonants) % k == 0,即元音字母和辅音字母的数量的乘积能被 k 整除。返回字符串 s 中 非空美丽子字符串 的数量。子字符串是字符串中的一个连续字符序列。英语中的 元音字母 为 'a'、'e'、'

2023-11-27 07:00:00 258

原创 C++二分查找:统计点对的数目

给你一个无向图,无向图由整数 n ,表示图中节点的数目,和 edges 组成,其中 edges[i] = [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。第 j 个查询的答案是满足如下条件的点对 (a, b) 的数目:a < bcnt 是与 a 或者 b 相连的边的数目,且 cnt 严格大于 queries[j] 。请你返回一个数组 answers ,其中 answers.length == queries.length 且 answer

2023-11-26 09:32:59 155 4

原创 C++双指针算法:统计点对的数目

给你一个无向图,无向图由整数 n ,表示图中节点的数目,和 edges 组成,其中 edges[i] = [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。第 j 个查询的答案是满足如下条件的点对 (a, b) 的数目:a < bcnt 是与 a 或者 b 相连的边的数目,且 cnt 严格大于 queries[j] 。请你返回一个数组 answers ,其中 answers.length == queries.length 且 answer

2023-11-26 09:30:26 77 1

原创 C++动态规划算法:最多可以参加的会议数目

给你一个 events 数组,其中 events[i] = [startDayi, endDayi, valuei] ,表示第 i 个会议在 startDayi 天开始,第 endDayi 天结束,如果你参加这个会议,你能得到价值 valuei 。同时给你一个整数 k 表示你能参加的最多会议数目。你同一时间只能参加一个会议。如果你选择参加某个会议,那么你必须 完整 地参加完这个会议。会议结束日期是包含在会议内的,也就是说你不能同时参加一个开始日期与另一个结束日期相同的两个会议。请你返回能得到的会议价值

2023-11-25 07:00:00 310 10

原创 C++算法:字符串中的查找与替换

你会得到一个字符串 s (索引从 0 开始),你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出:indices, sources, targets。要完成第 i 个替换操作:检查 子字符串 sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。如果没有出现, 什么也不做 。如果出现,则用 targets[i] 替换 该子字符串。例如,如果 s = "abcd" , indices[i] = 0 , sources[i] = "ab", ta

2023-11-25 06:45:00 170 1

原创 C++二分向量算法:最多可以参加的会议数目 II

给你一个 events 数组,其中 events[i] = [startDayi, endDayi, valuei] ,表示第 i 个会议在 startDayi 天开始,第 endDayi 天结束,如果你参加这个会议,你能得到价值 valuei 。同时给你一个整数 k 表示你能参加的最多会议数目。你同一时间只能参加一个会议。如果你选择参加某个会议,那么你必须 完整 地参加完这个会议。会议结束日期是包含在会议内的,也就是说你不能同时参加一个开始日期与另一个结束日期相同的两个会议。请你返回能得到的会议价值

2023-11-24 07:00:00 424 13

原创 C++二分算法:最多可以参加的会议数目 II

给你一个 events 数组,其中 events[i] = [startDayi, endDayi, valuei] ,表示第 i 个会议在 startDayi 天开始,第 endDayi 天结束,如果你参加这个会议,你能得到价值 valuei 。同时给你一个整数 k 表示你能参加的最多会议数目。你同一时间只能参加一个会议。如果你选择参加某个会议,那么你必须 完整 地参加完这个会议。会议结束日期是包含在会议内的,也就是说你不能同时参加一个开始日期与另一个结束日期相同的两个会议。请你返回能得到的会议价值

2023-11-24 06:45:00 210

原创 C++二分算法:得到子序列的最少操作次数

给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素。每一次操作中,你可以在 arr 的任意位置插入任一整数。比方说,如果 arr = [1,4,1,2] ,那么你可以在中间添加 3 得到 [1,4,3,1,2] 。你可以在数组最开始或最后面添加整数。请你返回 最少 操作次数,使得 target 成为 arr 的一个子序列。一个数组的 子序列 指的是删除原数组的某些元素(可能一个元素都不删除),同时不改变其余元素的相对顺序得到的数组。比方说

2023-11-23 07:15:00 1448 119

原创 C++单调向量算法:得到山形数组的最少删除次数

我们定义 arr 是 山形数组 当且仅当它满足:arr.length >= 3存在某个下标 i (从 0 开始) 满足 0 < i < arr.length - 1 且:arr[0] < arr[1] < ... < arr[i - 1] < arr[i]arr[i] > arr[i + 1] > ... > arr[arr.length - 1]给你整数数组 nums​ ,请你返回将 nums 变成 山形状数组 的​ 最少 删除次数。

2023-11-23 06:53:33 168

原创 C++单调向量算法:132模式枚举1简洁版

132模式枚举1简洁版

2023-11-22 07:00:00 552 18

原创 C++二分算法:得到山形数组的最少删除次数

我们定义 arr 是 山形数组 当且仅当它满足:arr.length >= 3存在某个下标 i (从 0 开始) 满足 0 < i < arr.length - 1 且:arr[0] < arr[1] < ... < arr[i - 1] < arr[i]arr[i] > arr[i + 1] > ... > arr[arr.length - 1]给你整数数组 nums​ ,请你返回将 nums 变成 山形状数组 的​ 最少 删除次数。

2023-11-22 06:45:00 180 2

原创 C++二分查找算法:132模式枚举3简洁版

132模式枚举3简洁版。

2023-11-21 07:00:00 642 11

原创 C++二分算法:找到最接近目标值的函数值

Winston 构造了一个如上所示的函数 func 。他有一个整数数组 arr 和一个整数 target ,他想找到让 |func(arr, l, r) - target| 最小的 l 和 r 。请你返回 |func(arr, l, r) - target| 的最小值。请注意, func 的输入参数 l 和 r 需要满足 0

2023-11-21 06:45:00 234

[二分查找双指针]LeetCode881: 救生艇

给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。

2023-12-03

两数之和 - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。 以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。 你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

2023-11-26

C++二分查找算法:132 模式

给你一个整数数组 nums ,数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成,并同时满足:i < j < k 和 nums[i] < nums[k] < nums[j] 。 如果 nums 中存在 132 模式的子序列 ,返回 true ;否则,返回 false 。

2023-11-12

C++算法:第 N 位数字原理、源码、测试用例

给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字。 示例 1: 输入:n = 3 输出:3 示例 2: 输入:n = 11 输出:0 解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。 提示: 1 <= n <= 231 – 1

2023-11-05

C++二分查找算法应用:最长递增子序列 原理、源码、测试用例

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。 示例 2: 输入:nums = [0,1,0,3,2,3] 输出:4 示例 3: 输入:nums = [7,7,7,7,7,7,7] 输出:1 参数范围: 1 <= nums.length <= 2500 -104 <= nums[i] <=104

2023-10-29

二分应用:峰值查找 原理、源码、测试用例

1. 题目 长度为n的数组nums,请返回任意一峰值的索引。符合以下条件之一i便是峰值的索引。 n等于1 i等于0 n>1 i等于0 nums[i] >nums[i+1] n>1 i等于n-1 nums[i] > nums[i-1] 0<i<n-1 nums[i]>nums[i-1] nums[i]>nums[i+1] 题目保证nums[i]不等于nums[i+1]。 2. 分析 假定: nums[left,r)符合nums[left]>nums[left-1],且nums[r-1]>nums[r]。显然初始情况nums[0,n)符合。 推论一:如果[left,r)的长度为1,则left就是返回的索引。 推论二:假定left < mid<r。如果mid[mid] > mid[mid-1],则nums[mid,r)也符合假定。如果mid[mid] < mid[mid-1],则nums[left,mid)也符合假定。 推论三:推论二也可以也可以理解成分别抛弃[left,mid)和[mid,r)。令mid = left+(r-left)/2,由于r-left>=2,所以left<mid<

2023-10-22

C++算法:前缀和基础

长度为n的数组nums,共有n+1个以nums[0]开始的子数组。索引范围分别为[0,i),i取值区间[0,n]。preSum[i]记录子数组[0,i)的和。比如:nums = {1,2,3,4},则preSum = {0,1,3,6,10}。通过preSum,我们可以求任意nums的子数组和。子数组[i,j)等于子数组[0,j)减去[0,i),也就是子数组[i,j)的和等于preSum[j] – preSum[i]。如果i等于j,则preSum[i]-preSum[i],和为0,符合计算公式。如果i大于j,则非法,需要提前排除。

2023-10-15

时间复杂度O(40n*n)的C++算法:修改图中的边权

给你一个 n 个节点的 无向带权连通 图,节点编号为 0 到 n - 1 ,再给你一个整数数组 edges ,其中 edges[i] = [ai, bi, wi] 表示节点 ai 和 bi 之间有一条边权为 wi 的边。 部分边的边权为 -1(wi = -1),其他边的边权都为 正 数(wi > 0)。 你需要将所有边权为 -1 的边都修改为范围 [1, 2 * 10^9] 中的 正整数 ,使得从节点 source 到节点 destination 的 最短距离 为整数 target 。如果有 多种 修改方案可以使 source 和 destination 之间的最短距离等于 target ,你可以返回任意一种方案。 如果存在使 source 到 destination 最短距离为 target 的方案,请你按任意顺序返回包含所有边的数组(包括未修改边权的边)。如果不存在这样的方案,请你返回一个 空数组 。 注意:你不能修改一开始边权为正数的边。

2023-10-14

多源最短路径的原理及C++实现

当一层循环执行完后,m_vMat[i1][i2]表示经过[0,i)中的任意个点的最短距离。 初始状态下, m_vMat[i1][i2]表示直达的最小距离,也就是经过0个点。 通过[0,i)中任意个点,i1到i2的最短路径记为PrePathi1i2,通过[0,i+1)中任意个点,i1到i2的距离的路径为Pathi1i2,如果Path不经过Pathi1i2,则和PrePathi1i2相同。如果经过则可以拆分成{i1…i}+{i…i2},显然{i1…i}是PrePathi1i,{i…i2}是PrePathii2,否则替换成PrePathi1i和PrePathii2。 m_vMat同时表示PreMath和Math,如果m_vMat[i1][i]或m_vMat[i][i2]已经更新,会带来错误的结果么?结果是不会,会更新但值不变。 当i1等于i时: m_vMat[i][i2] = min(…, m_vMat[i][i] + m_vMat[i][i2]); 由于m_vMat[i][i]为0,所以右式就是左式。 当i2等于i时,类似。

2023-10-04

堆优化迪氏最短单源路径原理及C++实现

4.1. 时间复杂度 O(ElogE),E是边数。适用与稀疏图。 4.2. 使用前提 边的权为正。可以非连通,非连通的距离为-1。 4.3. 原理 优选队列(小根堆)记录两个数据:当前点到源点距离,当前点。先处理距离小的点;如果距离相等,先处理谁都可以。可以用pair记录,不用重写小于。优先队列只记录如下情况的距离: 一,{0,源点}。 二,任意点的最短距离和可以直达的边。 如果是有向图,则入队数量等于边数,计算出起点最短路径的那一轮。无向图,则翻倍。显然出队数量等于入队数量。优先队列入队和出队时间复杂度都是O(logn),故总时间复杂度为O(nlogn)。

2023-10-03

.有向图计数优化版原理及C++实现

不需要拓扑排序,也不需要并集查找,直接dfs了。完成以下三个职责: 一,DFS那些端点在环上。 二,DFS环上各点此环的长度。 三,DFS非环上各点。

2023-10-02

有向图访问计数的原理及C++实现

现有一个有向图,其中包含 n 个节点,节点编号从 0 到 n - 1 。此外,该图还包含了 n 条有向边。 给你一个下标从 0 开始的数组 edges ,其中 edges[i] 表示存在一条从节点 i 到节点 edges[i] 的边。 想象在图上发生以下过程: 你从节点 x 开始,通过边访问其他节点,直到你在 此过程 中再次访问到之前已经访问过的节点。 返回数组 answer 作为答案,其中 answer[i] 表示如果从节点 i 开始执行该过程,你可以访问到的不同节点数。 2 <= n <= 100000 无自环。

2023-10-01

朴素迪氏最短单源路径的原理及C++源码及测试用例

Dijkstra算法,翻译为迪杰斯特拉或狄克斯特拉。在下驽钝,记不住如此长的翻译,故简称迪氏。 3.1.时间复杂度 O(n2),端点数的平方。 3.2.使用前提 边的权为正。可以非连通,非连通的距离为-1。

2023-09-30

01BFS最短距离原理和C++实现

n个端点的无向图,编号范围[0,n)。Edges0表示{{n1,n2},...{n3,n4}}表示n1和n2,n3和n4之间有路联接。Edges1表示{{n1,n2},...{n3,n4}}表示n1和n2,n3和n4之间有损坏的路连接。要想让s和d之间至少有一条通道,最小需要维修多少条路。如果无法到达,请返回-1。可能有环,但无自环,重边,可能不联通。

2023-09-29

深度优先搜索(BFS)的原理和C++实现

n个端点的无向图,编号范围[0,n)。每个端点最多4条出边。edges表示{{n1,n2},...{n3,n4}}表示n1和n2,n3和n4之间有边联接。求s到d的最少需要经过多少条边。如果无法到达,请返回-1。可能有环,但无自环,重边,可能不联通。

2023-09-28

美丽塔单调栈O(n)解法

给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i ,高度为 heights[i] 。 如果以下条件满足,我们称这些塔是 美丽 的: 1 <= heights[i] <= maxHeights[i] heights 是一个 山状 数组。 如果存在下标 i 满足以下条件,那么我们称数组 heights 是一个 山状 数组: 对于所有 0 < j <= i ,都有 heights[j - 1] <= heights[j] 对于所有 i <= k < n - 1 ,都有 heights[k + 1] <= heights[k] 请你返回满足 美丽塔 要求的方案中,高度和的最大值 。

2023-09-27

较难算法: 美丽塔 时间复杂度O(nlongn)

给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i ,高度为 heights[i] 。 如果以下条件满足,我们称这些塔是 美丽 的: 1 <= heights[i] <= maxHeights[i] heights 是一个 山状 数组。 如果存在下标 i 满足以下条件,那么我们称数组 heights 是一个 山状 数组: 对于所有 0 < j <= i ,都有 heights[j - 1] <= heights[j] 对于所有 i <= k < n - 1 ,都有 heights[k + 1] <= heights[k] 请你返回满足 美丽塔 要求的方案中,高度和的最大值 。

2023-09-24

让数组不相等的最小总代价

让数组不相等的最小总代价 可运行源码,VS2022 C++17 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,两者长度都为 n 。每次操作中,你可以选择交换 nums1 中任意两个下标处的值。操作的 开销 为两个下标的和。你的目标是对于所有的 0 <= i <= n - 1 ,都满足 nums1[i] != nums2[i] ,你可以进行 任意次 操作,请你返回达到这个目标的 最小 总代价。请你返回让 nums1 和 nums2 满足上述条件的 最小总代价 ,如果无法达成目标,返回 -1 。

2023-09-23

喜缺全书算法册 C++实现

当前阶段:以二分查找为主,前缀和为辅,之后会有其它算法的。文字算法见我的博文,视频算法见我的学院课程。 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,两者长度都为 n 。每次操作中,你可以选择交换 nums1 中任意两个下标处的值。操作的 开销 为两个下标的和。你的目标是对于所有的 0 <= i <= n - 1 ,都满足 nums1[i] != nums2[i] ,你可以进行 任意次 操作,请你返回达到这个目标的 最小 总代价。请你返回让 nums1 和 nums2 满足上述条件的 最小总代价 ,如果无法达成目标,返回 -1 。 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i ,高度为 heights[i] 。 如果以下条件满足,我们称这些塔是 美丽 的:

2023-09-17

二分查找旋转数组源码和视频

包括视频和三个版本的源码(初始、寻找右数组左边界、完成) 已知整数数组nums,先按升序排序后,再旋转。旋转k位后,元素分别为nums[k],nums[k+1]...nums[0]...nums[k-1]。请查找target 是否存在,如果存在返回所在索引;否则返回-1。假定nums没有重复的元素。 假定排序后的数组为{1,2,3,4,5}。 旋转0位:不变。 旋转1位:{2,3,4,5,1} 旋转2位:{3,4,5,1,2} 旋转3位:{4,5,1,2,3} 旋转4位:{5,1,2,3,4} 1.解题思路 观察后,可以得到如下结论: 旋转数组,可以拆分成左右两个升序数组,且左数组的任意元素都大于右数组的任意元素。 分两步: 一,找到数组的分界线RBegin,[0,RBegin)是左数组,[RBegin,n)是右数组。特殊情况:只有一个升序数组,则RBegin为0,左数组为空。 如果是小于等于nums.back(),在右边找;否则在左边找。升序寻找元素之前已经讲过了,就不累赘了。

2023-08-20

闻缺陷则喜之平凡的经历

自己的经历:一,工作中的踩得坑。 二,生活的点点滴滴。 三,女儿成长相关。 四,投资理财的亏损与教训

2023-08-18

《闻缺陷则喜》之《主册》

闻缺陷则喜 1 第一章:平凡的经历 5 第二章:观念与想法 5 1. 基础 6 1.1. 认知鸿沟 6 2. 传播 6 3. 沟通 6 3.1. 淡化对错 6 3.2. 不要随意批评别人 6 3.3. 参与感 6 3.4. 如果错了,马上认错 7 3.5. 从别人的立场说服对方 7 3.6. 具体到场景 7 4. 交往与合作 7 4.1. 双赢思维 7 4.2. 合作层次 8 4.3. 能力+信息(情报)+资源=成就 8 5. 工作相关 8 5.1. 金融骗局 8 5.2. 对小白而言创业比股票危险的多 9 5.3. 投资比创业稳妥的多 9 5.4. 程序员干不到30岁 9 5.5. 忠诚度与能力 10 5.6. 拒绝无意义加班 10 5.7. 内卷的历史 11 5.8. 关于社保 11 6. 家庭相关 12 6.1. 我的遗产 12 6.2. 金钱观 12 6.3. 借贷观 13 6.4. 女儿的婚姻 13 6.5. 轶事 14 6.6. 生育观 15 6.7. 教育观 15 6.8. 不要因为担心亲友不舒服,而不指出错误 16 7. 工作技巧 16 7.1. 八二原理 16 8.

2022-09-10

C# 获取C++的连续数据

C# 获取C++的连续数据。 两种方式:1,返回C++指针,2,将值存到C#的数组中。

2022-04-02

闻缺陷则喜版本号20220123

包括:问题定义、系统分析、架构、概要设计、详细设计、测试等!

2022-01-23

闻缺陷则喜2021年12月26.doc

闻缺陷则喜,本人拙作,注将软件工程。

2021-12-26

闻缺陷则喜20211205

包括:问题定义、系统分析、架构、概要设计、详细设计、测试等!

2021-12-07

关于halcon膨胀腐蚀开闭.doc

关于halcon膨胀腐蚀开闭

2021-11-14

简单的C#类 生成对应的C#类

开发工具: C#2013 功能: 针对简单的C#类,生成对应的非托管C++类,并生成托管C++的转换函数。 应用场景: 界面层、数据层C#,逻辑层C++。 简单的C#类:类型只包括 double string List

2021-11-07

Windows性能监控工具Perfmon使用

Windows性能监控工具Perfmon使用

2021-10-31

保存文件的同时删除文件,保存用时会略微升高

保存文件的同时删除文件,保存用时会略微升高。没必要花大功夫专门处理 保存500文件用时(毫秒):30906 删除文件同时,保存500文件用时(毫秒):30263 删除500文件用时(毫秒):363 保存500文件用时(毫秒):29155 删除文件同时,保存500文件用时(毫秒):29258 删除500文件用时(毫秒):426 保存500文件用时(毫秒):27992 删除文件同时,保存500文件用时(毫秒):29068 删除500文件用时(毫秒):686 保存500文件用时(毫秒):29172 删除文件同时,保存500文件用时(毫秒):31837 删除500文件用时(毫秒):337 保存500文件用时(毫秒):29373 删除文件同时,保存500文件用时(毫秒):29563 删除500文件用时(毫秒):321 保存500文件用时(毫秒):29663 删除文件同时,保存500文件用时(毫秒):30180 删除500文件用时(毫秒):350

2021-10-11

闻缺陷则喜2021九月版

主要增加:C#调用托管C++,托管C++调用C++

2021-09-11

多线程样例一 读写参数文件

事情起因: 修改配置后,C++函数取读配置xml时,相机缓存满了而引起崩溃。几率发生。 解决思路: 读文件费时间,所以开一个线程读文件。 抽象后的类似demo: 假定读文件需要0.6秒,图像处理(用存文件代替)需要0.5秒,各执行100次。 类和函数 读取文件函数: 一,List<int>增加本序号(0开始)。 二,随机生成5000整数,加到list<int>中。 三,写文件(文件名为序号,如0.txt),文件夹File。 四,Sleep(600)。 五,记录日志:本函数开始执行 时间,结束时间,序号。 六,复制List<int>到参数。 模拟图像处理函数: 一,复制参数 二,参数保存到文件,文件名list<int>第一个int,文件夹img。 三,Sleep(500)。 六,记录日志:本函数开始执行 时间,结束时间,序号。 参数类(跨线程): 一,从list<int>复制参数。 二,复制数据到list<int>。 线程: 启动线程“读取参数”线程:执行100次 读取参数功能。 启动线程“模拟图像处理”线程:执行100次 模拟图像处理。 运行预期结果: File文件夹中有0到100共101个文件。 img有约80个文件。 img有的文件,File文件夹中一定有,且完全相同。用文件夹比较工具(如:BCompare)查看。 查看日志:“读取参数”线程约60秒完成,模拟图像处理”线程约50秒完成。

2021-09-09

C#调用C++的类和函数

C#直接调用C++的函数,C#调用托管C++,C++托管调用非托管C++

2021-08-31

《闻缺陷则喜》之《软件开发的那些人》 20230917

软件团队的那些人(理论) 4 1. 引言 5 1.1. 你的灯开着么? 5 1.2. 货车过山洞 5 1.3. 软件维护之痛 5 2. 软件过程与思想 6 2.1. 基础 6 2.2. 过程模型 12 2.3. 敏捷开发 14 2.4. 编程范式 15 2.5. 工具 16 3. 问题定义 18 3.1. 基础 18 3.2. 过滤概念(可行性分析) 20 3.3. 用户细分 22 3.4. 模式 22 4. 系统分析 23 4.1. 基础 24 4.2. 用户画像 25 1.1 RFM模型 25 4.3. 需求收集与整理 25 4.4. 系统分析 26 5. 架构设计 26 5.1. 开发期质量 26 5.2. 运行期质量 28 5.3. 沟通 35 5.4. 架构内容 36 5.5. 架构模式 38 5.6. 关于重构 39 5.7. 其它 42 6. 概要设计 44 6.1. 设计模式六大原则 44 6.2. 设计模式 45 6.3. 反模式 46 6.4. 模块划分、公共数据、资源设计、接口 46 6.5. 界面设计 49 6.6. 数据存储设计 49 6.7. 工时预估与工作

2021-08-09

作为公共组软件工程师如何工作

作为公共组软件工程师如何工作 1 1 为什么需要公共组 1 1.1 专业化分工带来高效 1 1.2 复用 2 2 公共组成员特点 3 3 公共组成员职责 3 3.1 一般团队公共软件工程师职责 3 3.2 小团队公共软件工程师职责 3 4 已整理的类库介绍 4 4.1 SNGraph 4 4.2 SN 5 4.3 SNMFC 6 4.4 SNSTL 7 4.5 其它 7 5 专业化分工 7 5.1 专业化分工实例 7 5.2 专业化分工优点(亚当斯密) 7 5.3 专业化分工优点(无名高人) 8 5.4 专业化分工缺点 8 6 软件复用 8 6.1 软件复用的优点 8 6.2 软件复用级别 9 6.3 代码复用的类型 9

2019-02-10

士农库1.1 头文件、lib、dll 两个测试项目

4.1 SNGraph 一 点、向量 基本运算 二 直线(线段、射线) 直线(线段、射线)用起点、方向(单位向量)、线段长度表示。 包括如下功能:  点是否在直线上。  假定点在直线上,点到直线起点的有向距离。如果点在直线上,点到直线距离为n。如果n>=0,则点在射线上;如果(n>=0)&&(n <= 线段长度) ,则点在线段上。  两直线是否平行或重合。  两直线是否重合。  两直线是否垂直。  两直线交点。  两非平行直线距离。  求垂足。 三 平面 通过过平面一点和方向(单位矢量)表示平面。包括如下功能:  点到平面的有向距离。通过平面标准法向量和距离,可以求垂足;通过点到平面的距离的正负,可以看出多个点是否在同侧;如果点到平面的距离为0,则点在平面上,否则不在平面上。  直线是否在平面上  平面和直线的交点 通过调用其他功能可以实现的功能:  平面的法向量平行于直线,则平面和直线垂直  平面的法向量垂直于直线,则平面和直线平行  平面的法向量平行(垂直)则平面平行(垂直)  平行平面的距离等于平面任意一点到另一平面的距离 四 矩阵 包括以下功能:  初始化为单位矩阵。  为向x,y,z方向缩放建立矩阵。  为任意方向缩放建立矩阵。投影平面,可以通过向平面法线方向缩放0实现。平面镜像,可以通过向平面法线方向缩放-1实现。  为对一个点镜像建立矩阵。  为对一条直线镜像建立矩阵。  为对一条对称轴旋转建立矩阵。  求对应行列式的值。  求逆矩阵。  求转置矩阵。  左乘。  求对应行列式的代数余子式。  常见运算符。 4.2 SN 封装了许多基础的功能。 一 接口  读写锁。 二 避免依赖其它类库 有些类经常用于库间接口,所以需要避免依赖其它类库。  字符串类、函数,比如:宽字符、多字符间的转换。  时间类。  数组的封装。 三 其它  将错误信息记录到全局变量中,应用场景:构造函数和析构函数中throw会引起不可预料的问题。  安全缓存,额外开辟若干个字节的空间,并初始化为一个特定值,如果不越界,这些值不会改变。  智能指针,为了将关联降为依赖。CAutoPtr<C> m_pC代替C m_c,头文件中不需要引用C类的头文件。只需要声明C类,在源文件中引用C类的头文件。  MD5。  RSA。  SHA。  考虑溢出的加减法。比如:int型的10亿加20亿,-10亿减20亿。  通过表名、列名、某些列的值生成sql语句。  安全指针和防野指针类。防野指针类:在构造函数中将状态初始为已初始化,在析构函数中将状态设置为已释放。安全指针在使用时之前判断 防野指针类释放是“已初始化”,否则抛出异常。  将有参数的函数统一成没参数返回值类型void的仿函数。  遍历文件夹的文件和子文件夹。  随机数和排列组合。  系列化和反系列化。将对象和变量转化成二进制,并将二进制转回变量和对象。  拆分,如字符串。 4.3 SNMFC 一 网络功能  网络基本功能:如获取本机IP,通过域名获取IP,IE版本。  HTML对话框的封装类。  用于服务端的,带“回调类”的绑定监听类,利用IO完成端口。  用于客户端的,带“回调类”连接类,利用select模式完成,可以指定是否开启新线程。连接时,可以指定超时时间,默认5秒。如果直接调用系统的connect,超时时间是75秒。  能够自动处理“粘包”、“拆包”的二进制解析类。  安全套接字的辅助类,如:设置发送、连接超时。  比较服务端的某个文件夹和客户端的某个文件夹,并更新那些md5不同的文件。 二 多线程  用临界区实现的线程锁,和线程读写锁。  窗口辅助类。  开启一个线程并调用一个函数。  开启一个线程并循环调用一个函数。  支持多线程的日志。  启动一个线程,等待若干秒后,Post或Send一个消息后,结束线程。 三 界面  三态树控件。  列表框扩展类和函数。  树控件的扩展。  组合框的扩展。  关于窗口功能的封装。比如:从左到右依次排列子窗口,排不下则下一行。可以指定行间距。页眉和页脚是行间距的一半。  位图的加载和显示。 四 其它  Ini文件。  数组封装类。  获取硬件信息,如网卡。  文件或文件夹的常用功能。  注册表的扩展。 4.4 SNSTL  数组(向量)扩展。  用于多线程的向量。  JSON解析。  集合的扩展。  映射的扩展。  指针向量,可以存派生类。  指针映射,可以存派生类。 4.5 其它库  UnitTest,本机单元测试项目,对整个库的重要功能进行单元测试。  SNBCG,著名界面库的扩展,几乎没使用。  SNPicture,图形图像的处理(如转换bmp格式),几乎没使用。  SNMath,数学及数据结构库,几乎没使用。

2019-02-10

面试北京XX数通总结

面试北京XX数通总结 1 1 总括 1 1.1 面试时间 1 1.2 公司概况 1 1.3 老板疼点 1 2 如果入职 2 2.1 公共库 2 2.2 层次划分 2 2.3 设计与实现分离 2 3 关于外包 2 3.1 他们的期望 2 4 关于培训 3 5 建议 3 6 最后的结界 3 7 术语 3

2019-01-23

如果我当上技术经理如何开展工作

如果我当上技术经理如何展开工作 1 1 总括 1 1.1 引子 2 1.2 技术经理(总监)的任务 2 1.3 此职位和我高度匹配 2 2 术语、概念、假设 4 3 规划 5 3.1 不同阶段核心要素不同 5 3.2 研发部组织架构 6 3.3 规范 8 3.4 关注点 9 4 计划 10 5 培训与考核 11 5.1 培训 11 5.2 考核 11 5.3 对我的考核 12 5.4 晋升 12 6 需求与测试 12 6.1 不同性格在不同阶段的优劣 12 6.2 关于需求人员 13 6.3 关于测试人员 14 6.4 需求确认或整理 14 6.5 需求分解、任务跟踪 14 7 单人代码走查 14 7.1 代码走查员发展阶段 15 7.2 代码走查好处 15 7.3 我代码走查需要的时间 15 8 专业化分工及组建公司公共库 16 8.1 专业化分工 16 8.2 组建公司公共库 16 8.3 关于技术攻关 16

2019-01-06

最短点对演示程序

难点:如何测试。我的解决方式是:a,三种解法,看结果是否一致。b,小数据(100个点),人工排查。第一种方法,暴力法适合小数据。第二种方法:我的改进 型。第三种方法:经典方法(分治法)。实验证明1000万数据时,我的算法有优势。 暴力算法,O(n2)。我的改进型要点:先对所有数据按Y排序。只比较y距离小于等于已知最小距离的点对。经典方法:按Y排序,分成两部分,递归调用。合并师 只比较距离分界线不超过已知最小距离的点对。

2018-12-31

墨家巡逻兵1.0.2、编辑器、源码

mjxlb:源码 vc: 生成的exe位置。 SNCode:公共库的lib和头文件。 开发工具:VS2010 C++ mjxlb解决方案: basedata:基础模块。 logic:逻辑层。 show: 处理显示逻辑。 mojiaxunluobing:墨家巡逻兵 。 EditMJXLB: 墨家巡逻兵编辑器。

2018-11-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除