青训营创作活动

63 阅读2分钟

当青训营遇上码上掘金

主题三:

这段代码是一个用 Java 语言实现的广度优先搜索(BFS)算法,用于求出从数字 n 开始到达数字 k 所需的最少步数。该代码读入两个整数 n 和 k,并输出从 n 开始到达 k 所需的最少步数。

主函数 bfs 实现了 BFS 算法。它使用队列来记录待处理的节点,使用数组 visited 记录已经访问过的节点。该算法从将初始节点 n 添加到队列并将其标记为已访问。然后算法进入一个循环,该循环在队列为空时终止。在每次循环中,函数从队列的首位取出一个节点,并检查它是否是目标节点 k。如果是,则函数返回循环的次数,表示到达 k 所需的最少步数。

 如果当前节点不是目标节点,则函数通过减 1 和乘 2 生成两个新节点,并在它们在范围内(0 到 100000)且没有被访问过时将其添加到队列中。然后函数增加级别计数器,表示迄今为止已经进行的步数。

 该代码使用 Java 的 LinkedList 类实现

import java.util.Queue;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
      
        int n =5;
        int k = 15;
        int result = bfs(n, k);
        System.out.println(result);
        
    }

   public static int bfs(int n, int k) {
    Queue<Integer> queue = new LinkedList<>();
    boolean[] visited = new boolean[100001];
    queue.offer(n);
    visited[n] = true;
    int level = 0;
    
    while (!queue.isEmpty()) {
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            int node = queue.poll();
            if (node == k) {
                return level;
            }
            int next1 = node - 1;
            int next2 = node * 2;
            if (next1 >= 0 && !visited[next1]) {
                queue.offer(next1);
                visited[next1] = true;
            }
            if (next2 <= 100000 && !visited[next2]) {
                queue.offer(next2);
                visited[next2] = true;
            }
        }
        level++;
    }
    return -1;
}

}

主题四: 这是一种双指针法,用于解决「接雨水」问题。

 

创作过程:

 

题目理解:首先要仔细理解题目,明确题目中的柱子和青豆的意思。

思考算法:找到能解决这个问题的算法。由于每个柱子的宽度都是1,因此可以使用双指针法。

实现算法:创建一个双指针算法,分别从两端开始,遍历整个数组。

测试代码:用多组数据测试代码,以确保代码的正确性。

  public static void main(String[] args){
    int[] height = {0,1,0,2,1,0,1,3,2,1,2,1};
    int result = trap(height);
    System.out.println(result);
  }
        static int trap(int[] height) {
        int left = 0, right = height.length - 1;
        int leftMax = 0, rightMax = 0;
        int result = 0;
        while (left < right) {
            if (height[left] < height[right]) {
                if (height[left] >= leftMax) {
                    leftMax = height[left];
                } else {
                    result += leftMax - height[left];
                }
                left++;
            } else {
                if (height[right] >= rightMax) {
                    rightMax = height[right];
                } else {
                    result += rightMax - height[right];
                }
                right--;
            }
        }
        return result;
    }
  
}

经验总结:

题目理解:在写代码前,需要对题目进行仔细的理解,以确保正确的实现。

双指针法:双指针法是一种常用的算法,可以在处理一些数组问题时很有用。

数组问题:很多数组问题都可以通过双指针法来解决,如果能够找到适用的算法,可以大大简化代码。

多测试:在写代码后,要用多组数据测试代码,以确保代码的正确性。