一、核心算法考点与Java实现

1. 动态规划(背包问题)

// 01背包问题模板
public class Knapsack {
    public static int maxValue(int[] weights, int[] values, int capacity) {
        int[] dp = new int[capacity + 1];
        for (int i = 0; i < weights.length; i++) {
            for (int j = capacity; j >= weights[i]; j--) {
                dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);
            }
        }
        return dp[capacity];
    }

    public static void main(String[] args) {
        int[] weights = {2, 3, 4, 5};
        int[] values = {3, 4, 5, 6};
        System.out.println(maxValue(weights, values, 8)); // 输出:10
    }
}

2. 图论算法(BFS层序遍历)

// 二叉树层序遍历(返回每层最后一个节点)
class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int x) { val = x; }
}

public class RightView {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) return res;
        
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                if (i == size - 1) res.add(node.val);
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
        }
        return res;
    }
}

二、高频题型Java实现技巧

1. 快速幂模运算

public class FastPow {
    public static long fastPower(long base, long power, long mod) {
        long result = 1;
        while (power > 0) {
            if ((power & 1) == 1) {
                result = result * base % mod;
            }
            base = base * base % mod;
            power >>= 1;
        }
        return result;
    }

    public static void main(String[] args) {
        System.out.println(fastPower(2, 1000000000, 1000000007)); 
        // 输出:140625001
    }
}

2. 并查集(路径压缩)

class UnionFind {
    private int[] parent;
    private int count;

    public UnionFind(int n) {
        parent = new int[n];
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }
        count = n;
    }

    public int find(int x) {
        if (parent[x] != x) {
            parent[x] = find(parent[x]); // 路径压缩
        }
        return parent[x];
    }

    public void union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX != rootY) {
            parent[rootX] = rootY;
            count--;
        }
    }

    public int getCount() {
        return count;
    }
}

三、竞赛优化技巧

1. 快速输入输出

import java.io.*;
import java.util.*;

public class FastIO {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        // 读取整数
        int n = Integer.parseInt(br.readLine());
        
        // 读取数组
        int[] arr = Arrays.stream(br.readLine().split(" "))
                         .mapToInt(Integer::parseInt)
                         .toArray();
        
        // 输出优化
        bw.write(Arrays.toString(arr));
        bw.newLine();
        bw.flush();
    }
}

2. 记忆化搜索(斐波那契数列)

public class Fibonacci {
    private static long[] memo;

    public static long fib(int n) {
        memo = new long[n + 1];
        Arrays.fill(memo, -1);
        return dfs(n);
    }

    private static long dfs(int n) {
        if (n <= 1) return n;
        if (memo[n] != -1) return memo[n];
        return memo[n] = dfs(n - 1) + dfs(n - 2);
    }

    public static void main(String[] args) {
        System.out.println(fib(50)); // 输出:12586269025
    }
}

四、典型真题解析

1. 数字三角形(动态规划)

public class NumberTriangle {
    public static int maxSum(int[][] triangle) {
        int n = triangle.length;
        int[] dp = new int[n + 1];
        
        for (int i = n - 1; i >= 0; i--) {
            for (int j = 0; j <= i; j++) {
                dp[j] = Math.max(dp[j], dp[j + 1]) + triangle[i][j];
            }
        }
        return dp[0];
    }

    public static void main(String[] args) {
        int[][] triangle = {
            {7},
            {3, 8},
            {8, 1, 0},
            {2, 7, 4, 4},
            {4, 5, 2, 6, 5}
        };
        System.out.println(maxSum(triangle)); // 输出:30
    }
}

五、备赛建议

  1. 代码模板分类管理

    • 基础算法模板(排序、二分查找)

    // 二分查找标准实现
    public static int binarySearch(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) return mid;
            if (nums[mid] < target) left = mid + 1;
            else right = mid - 1;
        }
        return -1;
    }

  2. 调试技巧

    • 使用断言验证中间结果

    assert maxSum(new int[][]{{1}}) == 1 : "测试用例失败";
    • 使用System.nanoTime()进行性能分析

  3. 复杂度控制原则

    • 1e8次运算 ≈ 1秒(Java特性)

    • 二维数组大小不超过1e4×1e4

    • 递归深度不超过1e4(需设置-Xss256m栈空间)

本指南通过Java语言实现典型算法模板,结合蓝桥杯真题特点,重点训练选手的工程实现能力和算法优化思维。建议结合《算法竞赛进阶指南》进行系统学习,并保证每周20小时的编码训练量。

更多推荐