【Context】2020 LC 全国春季季编程大赛

C_01 拿硬币

桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。

输入:[4,2,1]
输出:4
解释:第一堆力扣币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。

示例 2:
输入:[2,3,10]
输出:8

限制:
1 <= n <= 4
1 <= coins[i] <= 10

方法一:模拟

public int minCount(int[] coins) {
    int sum = 0;
    for (int coin : coins) {
        if (coin % 2 == 0) {
            sum += coin/2;
        } else {
            sum += coin/2 + coin%2;
        }
    }
    return sum;
}

复杂度分析

  • 时间复杂度: O ( n ) O(n)
  • 空间复杂度: O ( 1 ) O(1)

B_02 传递信息

小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:

  • 有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0
  • 每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。
  • 每轮信息必须需要传递给另一个人,且信息可重复经过同一个人

给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数;若不能到达,返回 0。

输入:n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3
输出:3
解释:信息从小 A 编号 0 处开始,经 3 轮传递,到达编号 4。共有 3 种方案,
分别是 0->2->0->4, 0->2->1->4, 0->2->3->4。

方法一:dfs

建图,dfs…

List<List<Integer>> g;
int tot, N, K;
public int numWays(int n, int[][] edges, int k) {
    N = n;
    K = k;
    g = new ArrayList<>();
    for (int i = 0; i < n; i++) {
        g.add(new ArrayList<>());
    }
    for (int[] e : edges) {
        g.get(e[0]).add(e[1]);
    }
    dfs(k, 0);
    return tot;
}
void dfs(int id, int k) {
    if (k == 0) {
        if (id == N-1)
            tot++;
        return;
    }
    for (int nei : g.get(id)) {
        dfs(nei, k-1);
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n)
  • 空间复杂度: O ( n ) O(n)

方法二:bfs

正环: 这个题会有环,在环里面会一直走,导致超时,所以,当 k < 0 时,我们舍弃那些点。

List<List<Integer>> g;
int tot, N;
public int numWays(int n, int[][] edges, int k) {
    N = n;
    g = new ArrayList<>();
    for (int i = 0; i < n; i++) {
        g.add(new ArrayList<>());
    }
    for (int[] e : edges) {
        g.get(e[0]).add(e[1]);
    }
    bfs(k);
    return tot;
}
private void bfs(int k) {
    Queue<Integer> q = new LinkedList<>();
    q.add(0);
    while (!q.isEmpty()) {
        int s = q.size();
        while (s-- > 0) {
            int id = q.poll();
            if (k == 0 && id == N-1)
                tot++;
            if (k < 0)
                continue;
            for (int nei : g.get(id)) {
                q.add(nei);
            }
        }
        k--;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n)
  • 空间复杂度: O ( n ) O(n)

B_03

方法一:


复杂度分析

  • 时间复杂度: O ( ) O()
  • 空间复杂度: O ( ) O()

A_04

方法一:


复杂度分析

  • 时间复杂度: O ( ) O()
  • 空间复杂度: O ( ) O()

发布了714 篇原创文章 · 获赞 199 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/105601396