package chapter_computational_complexity;

import include.*;
import java.util.*;

public class space_complexity_types {
    /* 函数 */
    static int function() {
        // do something
        return 0;
    }
    
    /* 常数阶 */
    static void constant(int n) {
        // 常量、变量、对象占用 O(1) 空间
        final int a = 0;
        int b = 0;
        int[] nums = new int[10000];
        ListNode node = new ListNode(0);
        // 循环中的变量占用 O(1) 空间
        for (int i = 0; i < n; i++) {
            int c = 0;
        }
        // 循环中的函数占用 O(1) 空间
        for (int i = 0; i < n; i++) {
            function();
        }
    }

    /* 线性阶 */
    static void linear(int n) {
        // 长度为 n 的数组占用 O(n) 空间
        int[] nums = new int[n];
        // 长度为 n 的列表占用 O(n) 空间
        List<ListNode> nodes = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            nodes.add(new ListNode(i));
        }
        // 长度为 n 的哈希表占用 O(n) 空间
        Map<Integer, String> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            map.put(i, String.valueOf(i));
        }
    }

    /* 线性阶（递归实现） */
    static void linearRecur(int n) {
        System.out.println("递归 n = " + n);
        if (n == 1) return;
        linearRecur(n - 1);
    }

    /* 平方阶 */
    static void quadratic(int n) {
        // 矩阵占用 O(n^2) 空间
        int numMatrix[][] = new int[n][n];
        // 二维列表占用 O(n^2) 空间
        List<List<Integer>> numList = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            List<Integer> tmp = new ArrayList<>();
            for (int j = 0; j < n; j++) {
                tmp.add(0);
            }
            numList.add(tmp);
        }
    }

    /* 平方阶（递归实现） */
    static int quadraticRecur(int n) {
        if (n <= 0) return 0;
        int[] nums = new int[n];
        System.out.println("递归 n = " + n + " 中的 nums 长度 = " + nums.length);
        return quadraticRecur(n - 1);
    }

    /* 指数阶（建立满二叉树） */
    static TreeNode buildTree(int n) {
        if (n == 0) return null;
        TreeNode root = new TreeNode(0);
        root.left = buildTree(n - 1);
        root.right = buildTree(n - 1);
        return root;
    }

    /* Driver Code */
    public static void main(String[] args) {
        int n = 5;
        // 常数阶
        constant(n);
        // 线性阶
        linear(n);
        linearRecur(n);
        // 平方阶
        quadratic(n);
        quadraticRecur(n);
        // 指数阶
        TreeNode tree = buildTree(n);
        PrintUtil.printTree(tree);
    }
}
