摘要:
给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数。如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列: 对于 0 & nums) { int mod = 1e9+7; int m = nums.size(); int memo[m][m f = [&] 阅读全文
摘要:
给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time ,分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠: 一位需要 付费 的油漆匠,刷第 i 堵墙需要花费 time[i] 单位的时间,开销为 cost[i] 单位的钱。 一位 免费 的油漆匠,刷 任意 一堵墙的时间 阅读全文
摘要:
如果两个组中的每个点都与另一组中的一个或多个点连接,则称这两组点是连通的 返回连通两组点所需的最小成本 ###1. 状态压缩 + 动态规划 ``` class Solution { public: int connectTwoGroups(vector>& cost) { //这里使用状态压缩记录连 阅读全文
摘要:
### 一. 集合运算基础 使用二进制表示集合的选取状态 同样我们能快速的运用二进制实现一些遍历、交集、补集的操作 也能使用二进制存储对应状态,实现动态规划和剪枝 ####1. 集合与集合运算 ``` A&B //求集合交集操作 A|B //求集合并集操作 A&∼B //做差,在集合A中剔除B的元素 阅读全文
摘要:
``` INT_MAX = 2**63-1 = sys.maxsize #最大整型 INT_MIN = -2**63 = -sys.maxsize -1 #最小整型 float('inf') #比其它数都大的数 float('-inf') #比其它数都小的数 ``` 遍历枚举 ``` for val 阅读全文
摘要:
给你一个整数数组 nums 和两个整数:left 及 right 找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个数 ###1. 遍历区间右端点 + 同时记录满足条件的左边点位 数组中不能含有大于 right的元素, 且至少含有一个 阅读全文
摘要:
给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 另给你一个下标从 1 开始的二维数组 queries ,其中 queries[i] = [xi, yi] 对于第 i 个查询,在所有满足 nums1[j] >= xi 且 nums2[j] >= yi 的下标 j (0 贪 阅读全文
摘要:
给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出 其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。 树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点 返回数的第k个祖先节点,如果不存在返回-1 ###1. 倍增查找 阅读全文
摘要:
给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,其中每个节点 至多 有一条出边。 图用一个大小为 n 下标从 0 开始的数组 edges 表示,节点 i 到节点 edges[i] 之间有一条有向边。 如果节点 i 没有出边,那么 edges[i] == -1 。 1. 深度优先搜 阅读全文
摘要:
好人:该角色只说真话。 坏人:该角色可能说真话,也可能说假话 每个人都有对其他人的描述,存为一个n×n的二维矩阵 0认为是坏人,1认为是好人,2不做评价 返回最大好人数目 ###1. 暴力列举 + 二进制状态位 基于矛盾判断该状态是否有效 ``` class Solution { public: i 阅读全文