【力扣2】两数相加
题目给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 123输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807. 示例 2: 12输入:l1 = [0], l2 = [0]输出:[0] 示例 3: 12输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]输出:[8,9,9,9,0,0,0,1] 提示: 每个链表中的节点数在范围 [1, 100] 内 0 <= Node.val <= 9 题目数据保证列表表示的数字不含前导零 实现代码12345678910111213141516171819202122232425262728293031323334/** * Definition for singly-linked list. * public class ListNode...
【力扣373】查找和最小的K对数字
题目给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 示例 1: 1234输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3输出: [1,2],[1,4],[1,6]解释: 返回序列中的前 3 对数: [1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6] 示例 2: 1234输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2输出: [1,1],[1,1]解释: 返回序列中的前 2 对数: [1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3] 提示: 1 <= nums1.length, nums2.length <= 105 -109 <...
【力扣373】查找和最小的K对数字
题目给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n2) 的解决方案。 示例 1: 123输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8输出:13解释:矩阵中的元素为 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13 示例 2: 12输入:matrix = [[-5]], k = 1输出:-5 提示: n == matrix.length n == matrix[i].length 1 <= n <= 300 -109 <= matrix[i][j] <= 109 题目数据 保证 matrix 中的所有行和列都按 非递减顺序 排列 1 <= k <= n2 实现代码方式一 分治算法 12345678910111213141516171819202122232425262728293031323...
合并K个升序链表
合并K个升序链表解法递归合并优先级队列(推荐)分治算法适用场景 递归的时间复杂的是否和树的深度有关
【力扣82】删除排序链表中的重复元素II
题目给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 12输入:head = [1,2,3,3,4,4,5]输出:[1,2,5] 示例 2: 12输入:head = [1,1,1,2,3]输出:[2,3] 提示: 链表中节点数目在范围 [0, 300] 内 -100 <= Node.val <= 100 题目数据保证链表已经按升序 排列 实现代码方式一:链表分解 通过将链表分解为重复元素链表和不重复元素链表,最终返回不重复链表即可 123456789101112131415161718192021222324252627282930313233343536/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) &...
分治算法
如何判断是否使用分治算法 递归的时间复杂的是否和树的深度有关 将递归想象成一颗递归树,判断时间复杂的是否与树的的深度有关
贪心算法
如何判断是否使用贪心算法 选择是否影响未来可行性 比如凑硬币,存在硬币[1,5,8],不可重复选,凑出金额6的最少硬币数: 如果是贪心的话,首先会考虑先选8,这显然是不行的,那么就要退回,退回的话就不能用贪心算法,也就是说这次的选择导致不能往后选了
【力扣39】组合总和
题目给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 target 的不同组合数少于 150 个。 示例 1: 123456输入:candidates = [2,3,6,7], target = 7输出:[[2,2,3],[7]]解释:2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。7 也是一个候选, 7 = 7 。仅有这两种组合。 示例 2: 12输入: candidates = [2,3,5], target = 8输出: [[2,2,2,2],[2,3,3],[3,5]] 示例 3: 12输入: candidates = [2], target = 1输出: [] 提示: 1 <= candidates...
【力扣47】全排列II
题目给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 12345输入:nums = [1,1,2]输出:[[1,1,2], [1,2,1], [2,1,1]] 示例 2: 12输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 提示: 1 <= nums.length <= 8 -10 <= nums[i] <= 10 实现代码 使用DFS实现回溯算法 + 排序 + 剪枝 123456789101112131415161718192021222324252627282930313233343536class Solution { List<List<Integer>> traceList = new LinkedList<>(); LinkedList<Integer> trace = new LinkedList<>(); pub...
【力扣40】组合总和II
题目给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 **注意:**解集不能包含重复的组合。 示例 1: 12345678输入: candidates = [10,1,2,7,6,1,5], target = 8,输出:[[1,1,6],[1,2,5],[1,7],[2,6]] 示例 2: 123456输入: candidates = [2,5,2,1,2], target = 5,输出:[[1,2,2],[5]] 提示: 1 <= candidates.length <= 100 1 <= candidates[i] <= 50 1 <= target <= 30 实现代码 使用DFS实现回溯算法 + 排序 + 剪枝 12345678910111213141516171819202122232425262728293031323334353637383940clas...













