148. 排序链表 148. 排序链表 还原成数组结构借助内部排序方法显然不是面试官所期待的解法; 链表结构中模拟快排显然很复杂,因此想能不能用归并; 很容易将问题拆解成:查找中间结点、分治母链表、合并两个链表的子问题; 问题的难点在于如何在merge后保持链表的完整性,因此需要注意以下几个细节: 由于合并之后的链表的头结点可能和原head不一致,因此merge是有ListNode类型的返回值的; merge所返回 2020-11-29 技术沉淀 leetcode
493. 翻转对 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748class Solution { int count = 0; public int reversePairs(int[] nums) { mergeSort(nums, 0, 2020-11-28 技术沉淀 leetcode
31. 下一个排列 31. 下一个排列问题实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 分析注意到下一个排列总是比当前排列要大,除非 2020-11-10 技术沉淀 leetcode
求数组第k大或前k大问题 想借用此类问题深入理解快排特性。先给结论,再具体展示。 快排具有的特性: 快排在每轮排完,能使pivot元素置于最终排序结果的位置上; 对于正序排序,每轮排完的pivot元素的左边的元素均小于pivot,位于pivot右边的元素均大于pivot。(逆序排序正好相反) 快速排序属于交换排序,交换排序除了快排还有冒泡排序,但是冒泡是稳定的排序算法,但快排是不稳定的!因此不能用原有的快排思想解决要 2020-11-09 技术沉淀 leetcode
团灭股票问题 以下问题在没有进行状态压缩前,都是套用一个模板分析的状态转移、写出的代码,因此面试的时候可以直接先把没有进行状态压缩的算法写出来,再在此基础上修改代码优化空间。 122. 买卖股票的最佳时机 II12345678910111213141516171819202122232425262728// 状态量: // 天数 & 是否持有股票// dp[i][j]定义:// 第 2020-11-08 技术沉淀 leetcode
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 2020-11-07 技术沉淀 leetcode