1. 程式人生 > 其它 >hazy的leetcode刷題筆記(四)

hazy的leetcode刷題筆記(四)

技術標籤:leetcode演算法leetcodejava

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;
    }
}

在這裡插入圖片描述