分治
豌豆射手GCC
这个作者很懒,什么都没留下…
展开
-
multiset(平衡树)+分治(归并) 327. 区间和的个数
327. 区间和的个数给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。说明:最直观的算法复杂度是 O(n2) ,请在此基础上优化你的算法。示例:输入: nums = [-2,5,-1], lower = -2, upper = 2,输出: 3 解释: 3个区间分别是: [0,0], [2,2], [0,2],它们原创 2020-06-19 13:23:48 · 283 阅读 · 0 评论 -
快速排序+3 way partition+虚地址 324. 摆动排序 II
324. 摆动排序 II给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。示例 1:输入: nums = [1, 5, 1, 1, 6, 4]输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]示例 2:输入: nums = [1, 3, 2, 2, 3, 1]输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]说明:你可以假设所有输入都会得到有效的结果。进阶:你原创 2020-06-17 14:48:02 · 270 阅读 · 0 评论 -
快速选择+最小堆 215. 数组中的第K个最大元素
215. 数组中的第K个最大元素在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。最小堆创建一个最大堆,保留k个数,遍历一次后取出堆顶即可;class Solution {public:原创 2020-06-17 14:06:25 · 205 阅读 · 0 评论 -
归并排序+分治+计算逆序对 315. 计算右侧小于当前元素的个数
315. 计算右侧小于当前元素的个数给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。示例:输入: [5,2,6,1]输出: [2,1,1,0]解释:5 的右侧有 2 个更小的元素 (2 和 1).2 的右侧仅有 1 个更小的元素 (1).6 的右侧有 1 个更小的元素 (1).1 的右侧有 0 个更小的元素.解题类似计算逆序对:对每个数都计算逆序对,并原创 2020-06-14 14:34:04 · 193 阅读 · 0 评论 -
动态规划+反向推导+分治 312. 戳气球
312. 戳气球有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。求所能获得硬币的最大数量。说明:你可以假设 nums[-1] = nums[n] = 1,但原创 2020-06-14 11:26:48 · 242 阅读 · 0 评论 -
分治+递归 241. 为运算表达式设计优先级
241. 为运算表达式设计优先级给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。示例 1:输入: "2-1-1"输出: [0, 2]解释: ((2-1)-1) = 0 (2-(1-1)) = 2示例 2:输入: "2*3-4*5"输出: [-34, -14, -10, -10, 10]解释: (2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14原创 2020-06-04 10:59:37 · 168 阅读 · 0 评论 -
链表+归并排序+非递归 148. 排序链表
148. 排序链表在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5解题复杂度nlogn即为归并排序;递归方法分为merge和mergesort两步;(1)mergedummyhead维护归并后的链表,并返回;(2)merg原创 2020-05-24 17:00:00 · 402 阅读 · 0 评论 -
贪心策略+硬币找零+字符串+数组+分治 12. 整数转罗马数字+273. 整数转换英文表示
12. 整数转罗马数字罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ...原创 2020-04-30 16:56:18 · 272 阅读 · 0 评论 -
二分查找+部分有序 33. 搜索旋转排序数组 81. 搜索旋转排序数组 II
33. 搜索旋转排序数组假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7...原创 2020-04-27 19:11:51 · 204 阅读 · 0 评论 -
分治+最小堆(优先队列)+链表 23. 合并K个排序链表
23. 合并K个排序链表合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6来源:力扣(LeetCode)链接:https://leetcode-cn.com/pr...原创 2020-04-27 12:58:54 · 224 阅读 · 0 评论 -
分治+归并排序 面试题51. 数组中的逆序对
面试题51. 数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof著作权归领扣网络所有。商...原创 2020-04-24 20:31:38 · 225 阅读 · 0 评论 -
分治 002:求排列的逆序数
002:求排列的逆序数总时间限制: 1000ms 内存限制: 65536kB描述在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。对于不同的排名结果可以用逆序来评价它们之间的差异。考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik...原创 2020-03-22 11:30:54 · 503 阅读 · 0 评论 -
分治 001:输出前k大的数
001:输出前k大的数总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB描述给定一个数组,统计前k大的数并且把这k个数从大到小输出。输入第一行包含一个整数n,表示数组的大小。n < 100000。第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。第三行包含一个整数k。k < n。...原创 2020-03-22 11:19:11 · 570 阅读 · 1 评论