matteo's coding field.

matteo's coding field.

better late than never

LeetCode.312 Burst Balloons
https://leetcode.com/problems/burst-balloons/ 题意 给你一个数组,你要爆掉所有数字,爆某个数字的时候会获得它现在相邻的两个数字和它的乘积。如果这个数字没有左相邻或右相邻,则乘1代替,问爆掉所有数字的最高分数。思路 暴力计算的话复杂度为O(n!)肯定会超时 看到别人的解法是区间dp dp[i][j]表示只爆掉[i,j]里所有数字后能获得的最大分数,那么我们枚举[i,j]里最后一个爆掉的数字的位置k.由于我们只爆掉[i,j]里的元素,因此最后爆掉k的时候,k的左右邻居一定是i-1和j+1.初始化为:dp[i][i]=arr[i-1]arr[i]...
LeetCode.306 Additive Number
https://leetcode.com/problems/additive-number/ 题意 求解一个字符串是否是类似fibonacci,即每个数是否前两个数构成解法 看不懂题意~~看懂以后发现好像并不难,先求出前两个数,再往后推算即可 class Solution { public boolean isAdditiveNumber(String num) { int len = num.length(); //先取第一个数 for (int i = 1; i <= len; i++) { //从第一个数之后取第二...
LeetCode.300 Longest Increasing Subsequence
https://leetcode.com/problems/longest-increasing-subsequence/ 题意 求序列中最长可不连接递增序列😂解法 双重遍历,复杂度$O(n^2)$ 动态规划,以nums[i]结束的最大递增序列,即从nums[i]向前遍历,如果nums[j]小于nums[i]那么nums[i]=Math.max(nums[i], nums[j] + 1)```javaclass Solution { public int lengthOfLIS(int[] nums) { if (nums == null || nums.length == 0) ...
LeetCode.297 Serialize and Deserialize Binary Tree
https://leetcode.com/problems/serialize-and-deserialize-binary-tree/ 题意 实现Codec中序列化与反序列二叉树方法解法 序列化时采用按层次遍历,其中左右子结点为空时也加入结果 反序列化时 将第一个结点加入queue queue中出列,如果结点不为null,刚从结果中取两个结点,分别赋值给结点的左右子树 重复2直至queue为空 class Codec { // Encodes a tree to a single string. public String serialize(TreeNode root) {...
LeetCode.295 Find Median from Data Stream
https://leetcode.com/problems/find-median-from-data-stream/ 题意 实现一个MedianFinder,实现添加数字和查找中位数的功能,中位数定义为当数字个数位奇数时,返回中间的数,否则返回中间两个数的平均值解法 完全不知道怎么解,看了网上的解法才知道大小堆😂 大顶堆表示元素从小到大排列,大的元素在顶,小顶堆表示元素从大到小排列,小的元素在顶。且大堆中所有元素均小于小堆中元素。 解法中用PriorityQueue实现大小堆 class MedianFinder { //小顶堆,元素从小到大排列,先取到小的元素 Prior...
LeetCode.292 Nim Game
https://leetcode.com/problems/nim-game/ 题意 两个人依次取数,每次可以取1,2,3,给出一个数,求先取的能否获胜解法 获胜的人肯定是最后一个取数,可能取1,2,3,f(n)时只要f(n-1),f(n-2),f(n-3)中有一个不能取胜,那么f(n)就能取胜,类似于斐波那挈数列的求法。但是当n很大的时候递归肯定会StackOverFlow,因此用一个数组来保存中间结果,结果Memory Limit Exceeded😂😂 后来再一想,f(n)依赖于f(n-1),f(n-2),f(n-3)。其中f(1),f(2),f(3)是false,f(4)是tr...
LeetCode.279 Perfect Squares
https://leetcode.com/problems/perfect-squares/ 题意 给一个数,将它分解成整数的平方数之和,求最小的平方数的数量解法 BFS,采用queue计算中间结果,current表示当前值,count表示最小数量 将n入列 queue中取值赋给current,计算1到current之间的所有平方数 遍历1到current之前的平方数num,假如current等于平方数,因为是BFS,每一次都会遍历所有的可能结果,那么此时肯定是count最小值,返回结果,否则将current-num加入临时结果集 直到queue为空,说明这一层已经遍历结束,coun...
LeetCode.260 Single Number III
https://leetcode.com/problems/single-number-iii/ 题意 数组中除了两个数出现一次,其它的数都出现两次,求解要求满足时间复杂度O(n),空间复杂度O(1)解法 所有的数异或的结果就是两个数异或的结果,因为两个相同的数异或肯定是0,而0跟任何数异或都是那个数本身 最终结果转换成二进制的结果中为1的位,必然有其中一个数该位为1,另一个数该位为0,只有0,1异否才是1 将数组中的所有数与二进制中仅一位为1的数resInt异或,那么所有结果为0的数异或就是其中一个数,为1的是另外一个数。此时不需要考虑出现两次的数,因为他们与restInt的异或结果相...
LeetCode.233 Number of Digit One
https://leetcode.com/problems/number-of-digit-one/ 题意 求1到n之间所有数中1的出现次数解法 先计算出位数与n相同且为10的倍数的数,根据n的最大位digit分为两种情况 digit == 1,刚f(n) = 1 + n%k + f(n%k) + f(k-1),即以1开头位数与n相同的数共有n%k+1个,再加上n%k里1的出现次数再加上0到k-1里1的出现次数即是最后结果 digit != 1,则f(n) = f[k, n] + f(k-1),即结果为k到n的数里1的出现次数加上0到k-1里1的出现次数2.1 其中f[k, n] =...
avatar
matteo