934. 最短的桥
1 | class Solution { |
和之前写的一道题有点像,827. 最大人工岛
827. 最大人工岛我先dfs找到所有连通子图和包围岛的0点,然后找这些点中有无同时包围多个岛的,把他们的面积加起来取最大值
这道题也可以使用相同的方法,找到每个岛屿的边界点,然后计算边界点的距离(只有两个岛,两个岛之间肯定是可以连通的,且不管使用那条途径,最短距离一定是 $ abs(x_1 - x_2) + abs(y_1-y_2)-1 $)
看答案
1 | class Solution { |
1 | class Solution { |
和之前写的一道题有点像,827. 最大人工岛
827. 最大人工岛我先dfs找到所有连通子图和包围岛的0点,然后找这些点中有无同时包围多个岛的,把他们的面积加起来取最大值
这道题也可以使用相同的方法,找到每个岛屿的边界点,然后计算边界点的距离(只有两个岛,两个岛之间肯定是可以连通的,且不管使用那条途径,最短距离一定是 $ abs(x_1 - x_2) + abs(y_1-y_2)-1 $)
1 | class Solution { |
1 | class Solution { |
和之前写的一道题有点像,827. 最大人工岛
827. 最大人工岛我先dfs找到所有连通子图和包围岛的0点,然后找这些点中有无同时包围多个岛的,把他们的面积加起来取最大值
这道题也可以使用相同的方法,找到每个岛屿的边界点,然后计算边界点的距离(只有两个岛,两个岛之间肯定是可以连通的,且不管使用那条途径,最短距离一定是 $ abs(x_1 - x_2) + abs(y_1-y_2)-1 $)
1 | class Solution { |
1 | class Solution { |
4ms,和最快的思路刚好相反,用map存储arr的index,最快的思路是反过来,用map存一个piece的第一个index
1 | class Solution { |
1 | struct List { |
1 | class Solution { |
难,看懂解析思路后才写出来的
刚开始的思路是找0,把1分成了n段,取n/3 , 2n/3和 n段后面的0,然后向右移动双指针比较
后来发现有超级长的输入,超时了
解析的思路与我刚好相反,先数1的个数,如果是0或者不能被3整除,说明不能分成三段
1的个数为n,找到第0 n/3 2n/3个1,记为p1, p2, p3
p3到后末尾的长度就是三个子串的长度,如果p1 或 p2 + 字串长度分别大于p2 p3,说明无解
然后向后比较,若后面的数完全相同则有解
1 | class Solution { |
想法很简单,就是从左往右遍历,数当前遇到了几种水果,当遇到第三种水果后,更新一下装入水果的最大值,三种水果记录为typea, typeb, typec
然后回溯,找到前一个节点在左侧最后一个typea后第一次出现的位置(其实也是typea最后出现的位置的后两个位置)
1 | class Solution { |
1 | class Solution { |
想法很简单,就是从左往右遍历,数当前遇到了几种水果,当遇到第三种水果后,更新一下装入水果的最大值,三种水果记录为typea, typeb, typec
然后回溯,找到前一个节点在左侧最后一个typea后第一次出现的位置(其实也是typea最后出现的位置的后两个位置)
1 | class Solution { |
1 | class Solution { |
难,看懂解析思路后才写出来的
刚开始的思路是找0,把1分成了n段,取n/3 , 2n/3和 n段后面的0,然后向右移动双指针比较
后来发现有超级长的输入,超时了
解析的思路与我刚好相反,先数1的个数,如果是0或者不能被3整除,说明不能分成三段
1的个数为n,找到第0 n/3 2n/3个1,记为p1, p2, p3
p3到后末尾的长度就是三个子串的长度,如果p1 或 p2 + 字串长度分别大于p2 p3,说明无解
然后向后比较,若后面的数完全相同则有解
1 | class Solution { |
4ms,和最快的思路刚好相反,用map存储arr的index,最快的思路是反过来,用map存一个piece的第一个index
1 | class Solution { |
1 | struct List { |
1 | class Solution { |
两层while循环多次判断p<n,效率底下,实际上只需要当t_numRows==0或t_numRows==numRows-1时改变方向即可
实际上需要的string数组长度是min(n, numRows)
1 | class Solution { |
可以直接找新旧数列的数字关系,直接计算
1 | class Solution { |
执行用时:8 ms, 在所有 C++ 提交中击败了98.89%的用户
内存消耗:7.7 MB, 在所有 C++ 提交中击败了100.00%的用户
对nums数组,令nums[i] += i,这样表示i位置最远可以走到的距离
算法
从i = 0开始
对于当前i,可以从0走到nums[i],选取0-nums[i]的最大值,如果最大值大于等于n-1,则可以到达最后,若小于,重复这个步骤,除非i=最大值,则不能到达最后
为了降低时间复杂度,创建一个数组v,v[i] = max(nums[k]), k = 0,1,…,i
1 | class Solution { |