hazy的leetcode刷題筆記(四)
阿新 • • 發佈:2020-12-10
leetcode.842:將陣列拆分成斐波那契序列-每日一題
給定一個數字字串 S,比如 S = “123456579”,我們可以將它分成斐波那契式的序列 [123, 456, 579]。
形式上,斐波那契式序列是一個非負整數列表 F,且滿足:
0 <= F[i] <= 2^31 - 1,(也就是說,每個整數都符合 32 位有符號整數型別);
F.length >= 3;
對於所有的0 <= i < F.length - 2,都有 F[i] + F[i+1] = F[i+2] 成立。
另外,請注意,將字串拆分成小塊時,每個塊的數字一定不要以零開頭,除非這個塊是數字 0 本身。返回從 S 拆分出來的任意一組斐波那契式的序列塊,如果不能拆分則返回 []。
示例 1:
輸入:“123456579”
輸出:[123,456,579]
示例 2:
輸入: “11235813”
輸出: [1,1,2,3,5,8,13]
class Solution {
public List<Integer> splitIntoFibonacci(String S) {
/*基本思路:回溯演算法,看題解比較清晰,這是我做的第一個回溯的題,還是得看題解才能做出來
https://leetcode-cn.com/problems/split-array-into-fibonacci-sequence/solution/javahui-su-suan-fa-tu-wen-xiang-jie-ji-b-vg5z/
*/
List<Integer> result = new ArrayList<Integer>();
backtrack(S.toCharArray(), result, 0);
return result;
}
private boolean backtrack(char[] digit, List<Integer> result, int index) {
//邊界條件判斷,如果擷取完了,並且res長度大於等於3,表示找到了一個組合。
if(index == digit. length && result.size() >= 3) return true;
for(int i = index; i < digit.length; i++) {
//兩位以上的數字不能以0開頭
if(digit[index] == '0' && i > index) break;
//擷取字串轉化為數字
long num = subDigit(digit, index, i + 1);
//如果擷取的數字大於int的最大值,則終止擷取
if (num > Integer.MAX_VALUE) break;
int size = result.size();
//如果擷取的數字大於res中前兩個數字的和,說明這次擷取的太大,直接終止,因為後面越擷取越大
if (size >= 2 && num > result.get(size - 1) + result.get(size - 2)) break;
if (size <= 1 || num == result.get(size - 1) + result.get(size - 2)) {
//把數字num新增到集合res中
result.add((int)num);
//如果找到了就直接返回
if(backtrack(digit, result, i + 1)) return true;
//如果沒找到,就會走回溯這一步,然後把上一步新增到集合res中的數字給移除掉
result.remove( result.size() - 1);
}
}
return false;
}
//擷取字串S中的子串然後轉換為十進位制數字
private long subDigit(char[] digit, int start, int end) {
long result = 0;
for(int i = start; i < end; i++) {
result = result * 10 + digit[i] - '0';
}
return result;
}
}
leetcode.102:二叉樹的層序遍歷-hot100
給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
/*基本思路:使用一個佇列來存放節點,並指明每一層節點的個數
*/
public List<List<Integer>> levelOrder(TreeNode root) {
//存放節點
Queue<TreeNode> q = new LinkedList<>();
List<List<Integer>> result = new ArrayList<>();
if(root == null) return result;
q.offer(root);
while(true) {
//當佇列為空說明遍歷結束
if(q.size() == 0) break;
//當前這一層有多少個節點,用這個數來遍歷就不會超出這一層的範圍
int length = q.size();
List<Integer> temp = new ArrayList<>();
for(int i = 0; i < length; i++) {
//取佇列頭部
TreeNode node = q.poll();
temp.add(node.val);
//把左右節點放進佇列末尾
if(node.left != null) q.offer(node.left);
if(node.right != null) q.offer(node.right);
}
result.add(temp);
}
return result;
}
}