Leetcode打卡日记(2020.3.11-2020.3.15)

2020.3.11 将数组分为和相等的三个部分(1013)

给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false
形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + … + A[i] == A[i+1] + A[i+2] + … + A[j-1] == A[j] + A[j-1] + … + A[A.length - 1]) 就可以将数组三等分。
思路,要看到条件,每部分加起来一定为sum/3。
维护一个指针从数组头开始遍历,直到和为sum/3,维护一个指针从数组尾开始遍历,直到和为sum/3,检查两个指针中间的部分是否和为sum/3

2020.3.12 字符串的最大公因子(1071)

对于字符串S和T,只有在S=T+……+T时,才认为T能除尽S,返回最长字符串X,要求满足X能除尽str1且X能除尽str2。
如果它们有公因子 abc,那么 str1 就是m个 abc 的重复,str2 是n个abc 的重复,连起来就是 m+n个 abc,m+n个abc和n+m个abc是一样的。据此可判断问题是否有解。
辗转相除法,gcd(int a,int b){return b==0?a:gcd(b,a%b)}
当确定有解的情况下,最优解是长度为 gcd(str1.length, str2.length) 的字符串。
这个理论最优长度是不是每次都能达到呢?是的(?)。

2020.3.13 多数元素(169)

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
用HashMap记录每个元素出现的次数,或快速排序。

2020.3.14 最长上升子序列(300)

给定一个无序的整数数组,找到其中最长上升子序列的长度。
动态规划,时间复杂度为O(n^2)

2020.3.15 岛屿的最大面积(695)

给定一个包含了一些 0 和 1的非空二维数组 grid , 一个岛屿是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
使用种子算法,如果找到一个岛屿中的一个元素,即可递归找到这个岛屿的所有元素(向左、向上、向下、向右)。 遍历数组中的每个元素,如果其值为1,则递归找到这个岛屿的所有元素标记为-1,并记录大小;如果其值为0,则为海水,跳过;如果其值为-1,则是已经统计过的岛屿的一部分,也跳过。

你可能感兴趣的:(Leetcode打卡日记(2020.3.11-2020.3.15))