
OJ
文章平均质量分 70
atwdy
大数据开发、数据挖掘
展开
-
判断链表是否有环(集合&快慢指针)
问题:给定一个链表,判断其中是否有环。(能否给出空间复杂度O(1)的解)1.首先很容易想到的解法是利用set集合的无重复性,从表头head往后遍历,如果set集合中没有该结点则将该结点添加到集合中,如果已经存在该结点则说明有环,代码如下:public boolean hasCycle(ListNode head) { if (head == null) { return false; } HashSet<ListNode> set = new HashSet<ListNode原创 2021-07-30 08:49:42 · 1574 阅读 · 0 评论 -
0/1背包问题(动态规划+动规优化)
原题地址 动态规划(二维数组)dp优化(一维数组)根据dp数组获取选择的物品编号动态规划(二维数组)大致描述就是有 N 个物品,每件物品有各自的重量 W 及价值 V,有一个最大容量为 C 的背包,求在不超过这个背包的容量下能装入物品的最大价值。(N,W,V,C都为整数)假如对这些物品从1~i 进行编号,并用两个数组V、W分别保存物品的价值和重量,相应的 V[ i ] 和 W[ i ] 表示的意义是第 i 件物品的价值和重量。首先定义F[ i ][ j ] = 在背包容量为 j 的情况下从前 i 件原创 2021-07-30 08:36:52 · 1316 阅读 · 0 评论 -
最长公共子序列(动态规划)
1.最长公共子序列(不连续)是指从给定序列中随意去掉一些字符后形成的子序列。(随意的意思是可以不连续的去掉一些个,也可以一个不去)比如对于下面两个序列a:abcbdbb:acbbabdbb它们的最长公共子序列:acbdb,长度5。采用动态规划求解,定义F[ i, j ]为(a0,a1,...ai−1a_0,a_1,...a_{i-1}a0,a1,...ai−1)和(b0,b1,...bj−1b_0,b_1,...b_{j-1}b0,b1,...bj−1)的最长公共子序列长度。因此根原创 2021-07-30 08:34:33 · 1393 阅读 · 0 评论 -
棋盘覆盖问题(分治)
问题描述:在一个2k∗2k(k>0)2^k*2^k(k>0)2k∗2k(k>0)的棋盘,只有一个与其它方格不同的特殊方格,现在要用下图所示的 L 形骨牌覆盖除了特殊方格外的其它全部方格,任意两骨牌不能重叠,给出一种覆盖方法。本题可以将大棋盘划分为四个大小相同的象限,那么这个特殊方格必定存在其中一个象限,根据方格存在的不同象限,L 形骨牌的摆法:这样便能使被划分的四个象限均存在一个“特殊的方格”,达到分治的条件。分治一个最重要的特点在于一个复杂的大问题可以分解为几个性质或求解思路相原创 2021-07-30 08:33:20 · 1401 阅读 · 0 评论 -
整数拆分问题(动态规划+递归&记录数组)
问题描述:求将正整数 n 无序拆分成最大数为 k 的拆分方案个数,要求所有的拆分方案不重复。例如 n=5, k=5时, 对应的拆分方案如下:5 = 55 = 4 +15 = 3 + 25 = 3 + 1 + 15 = 2 + 2 + 15 = 2 + 1 + 1 + 15 = 1 + 1 + 1 + 1 + 1dp求解问题的特点:最优性原理,无后效性,重叠子问题。dp求解的核心就是得到状态转移方程,并注意对边界情况的处理。定义f(n, k)为正整数n拆分成最大数为k的拆分方案个数,下面原创 2021-07-30 08:31:50 · 1547 阅读 · 0 评论 -
子集和问题(回溯&分支限界)
觉得在用回溯解决01背包问题之前最好先解决一下子集和问题。问题描述:有nnn个不同正整数组成的集合W = { w1,w2,w3,...,wnw_1,w_2,w_3,...,w_nw1,w2,w3,...,wn } 和一个正整数Z,要求找出W中所有和为Z的子集。例如 W = { 11, 13, 24, 7 },Z = 31时,满足要求的子集为{ 11, 13, 7 }和{ 24, 7 }本题的解法其实就是树的先序遍历+剪枝。对于集合中的所有整数,都只有选或不选两种可能,以树的第1层表示第1个整原创 2021-07-30 08:30:59 · 3731 阅读 · 0 评论 -
最大连续子序列和(枚举+分治+在线处理)
原题地址四种解法1.枚举2.枚举优化3.分治4.在线处理题目描述:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。实例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。以下都是java实现1.枚举枚举是最容易想到的办法,就是列出所有可能的子序列并分别求和,返回最大者。public static int maxSubseqSum1(int[] nums) {原创 2021-07-30 08:27:13 · 279 阅读 · 2 评论