首先是两个贪心算法:
视频拼接
两个数中较大数:Math.max(//num1,//num2)
int [] num = new int[//index];
取二维数组的每一行:
for(int[] clip: clips){
if(clip[0] < T){
maxn[clip[0]] = Math.max(clip[1], maxn[clip[0]]);
}
}
题目有一个坑点似乎是因为视频可以录制所需时间外的区间,所以必须要clip[0] 小于所需要录制的T才可。
基本思路是,一个数组clips储存从0-T-1开始的片段最远的末尾,然后开始计算最小片段数:第一个(即0为开始)最远末端内,i++,每一个秒作为开头来根据clips更新最远的last,一个pre储存0秒的最远末端,当更新的i==pre时证明第一个片段已经到了尽头,必须要进入下一个片段才能剪辑到需要的秒数,也就是答案++;但在这之前,如果更新的last(即最远片段)==i,证明最远片段已经到目前需要的秒数,中间必然有空缺的片段不能被剪辑进入(因为clip[i]的最远片段不可能是i,等于没有,所以只能是缺了),所以不能完成剪辑
跳跃游戏
上一题的简单版。
甚至不需要数组记录每一个位置能去的最远位置(因为题目已经给了),直接last更新,i==pre就是不可能就可以了
枚举大法:
数组中的最长山脉
int length = num.length;
枚举山顶。
假设每一个点都是一个山脉,两个数组left、right记录左右山脉的长度。
对于left:left[0] 必然是0,因为左边没有数。从0开始,如果i位> i-1位,则证明当该位作为山顶时左边长度是前面一位作为山顶的长度+1,否则证明该位左边不符合条件,左边长度位直接为0;右边同理,i>i+1则为i+1位加1,否则为0
最后结果就是max(左+右+1)即可
独一无二的出现次数
思路很简单,主要是hashmap、hashtable、hashset的应用。
不知道为什么力扣的提交平台不能用hashmap……
map映射
set集合
求根到叶子节点的长度
复习了深度优先dfs算法:
大概就是每到一个字节点,前面的和*10,然后递归累加,直到最后的叶子结点(没得左右子节点的)
class Solution {
public int sumNumbers(TreeNode root) {
return dfs(root,0);
}
int dfs(TreeNode root, int sum){
if(root == null) return 0;
sum = sum*10 + root.val;
if(root.left == null && root.right == null) return sum;
else return dfs(root.left, sum) + dfs(root.right, sum);
}
}
岛屿的周长
这个也是暴力算法,除了这一步:
int m = grid[0].length, n = grid.length;
m记录的是grid[0],也就是一行有多少数;n记录的是grid,也就是有多少行,即列数
java的封装类型:Boolean,Byte,Short,Integer,Long,Character,Double,Float
s.substring(BI,EI)其中截取的字符串不包括EI上的字符
单词拆分
arraylist:get,add,remove以及遍历元素
奇怪的一点:字符串s.length()要加括号,但是数组的.length不需要加括号
boolean类型的初始化:均为false,除非参数初始化为true
HashSet<String> hs = new HashSet<String>(wordDict);
直接list转set了