118.杨辉三角
bug
自己的解法,一行一行构造超出了内存限制。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> init = new ArrayList<>();
init.add(1);
res.add(init);
if(numRows == 1)return res;
init.add(1);
res.add(init);
if(numRows == 2)return res;
init.remove(init.size() - 1);
for(int i = 3; i <= numRows; i++) {
res.add(init);
//res.get(i).add(1);
for(int j = 0; j < res.get(i-2).size() -1; j++) {
int x = res.get(i-2).get(j) + res.get(i-2).get(j+1);
res.get(i-1).add(x);
}
res.get(i-1).add(1);
}
return res;
}
}
把 j 的范围用i限制之后不会爆内存了但会超时, 因为第i行的长度也是i,后面显示数组越界,因为原来是把init的最后一个元素remove掉了。这里极有可能会影响之前的行,或许是因为引用变量?
所以第二行的长度也变为了1,导致后面循环的时候数组越界。j+1的地方。
又搞了个init2,结合输出来看,第一个元素是1,1而不是1。说明init后面的改变对之前产生了影响。那么init2也是,一切都是引用变量搞得鬼吧。怎么那么想当然呢。
官方
想清楚是j-1不是j+1.
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
for (int i = 0; i < numRows; ++i) {
List<Integer> row = new ArrayList<Integer>();
for (int j = 0; j <= i; ++j) {
if (j == 0 || j == i) {
row.add(1);
} else {
row.add(ret.get(i - 1).get(j - 1) + ret.get(i - 1).get(j));
}
}
ret.add(row);
}
return ret;
}
}
139.单词拆分
感觉和完全平方数,零钱兑换很像
要定义多一个长度的起始数组,用来存放初始状态吧。
hashSet通过list初始化?
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Set<String> wordDictSet = new HashSet(wordDict);
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for(int i = 1; i <= s.length(); i++){
// 获取每个dp[i]的值.
for(int j = 0; j < i; j++){
// 注意下标位置
if(dp[j] && wordDictSet.contains(s.substring(j,i))){
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}
}