C_01 pegue moedas
Existem n pilhas de moedas em cima da mesa e o número de cada pilha é armazenado nas moedas da matriz. Podemos escolher qualquer pilha de cada vez, pegar uma ou duas delas e encontrar o número mínimo de vezes para obter todas as deduções.
输入:[4,2,1]
输出:4
解释:第一堆力扣币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。
示例 2:
输入:[2,3,10]
输出:8
1 : 1 <= n <= 4
1 <= moedas [i] <= 10
Método 1: Simulação
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;
}
Análise de complexidade
- Complexidade do tempo: ,
- Complexidade do espaço: ,
B_02 Transferir informações
A criança A está jogando um jogo de informações com seus amigos. As regras do jogo são as seguintes:
- Existem n jogadores, todos os números de jogadores são 0 ~ n-1 e o número da criança A é 0
- Cada jogador tem um número fixo de outros jogadores que podem transmitir informações (ou não). A relação de transmissão de informações é unidirecional (por exemplo, A pode transmitir informações para B, mas B não pode transmitir informações para A).
- Cada rodada de informações deve ser passada para outra pessoa, e as informações podem passar pela mesma pessoa repetidamente
Dado o número total de jogadores n, e uma relação de matriz bidimensional que consiste em [número do jogador, correspondente ao número do jogador que pode ser passado]. O número de soluções retornadas do pequeno A (número 0) para o parceiro com número n-1 a k rodadas; se não puder ser alcançado, retornará 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。
Método 1: dfs
Construção, 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);
}
}
Análise de complexidade
- Complexidade do tempo: ,
- Complexidade do espaço: ,
Método 2: bfs
Anel positivo: haverá um anel nesta pergunta, que continuará andando no anel, resultando em um tempo limite; portanto, quando k <0, descartamos esses pontos.
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--;
}
}
Análise de complexidade
- Complexidade do tempo: ,
- Complexidade do espaço: ,
B_03
Método um:
Análise de complexidade
- Complexidade do tempo: ,
- Complexidade do espaço: ,
A_04
Método um:
Análise de complexidade
- Complexidade do tempo: ,
- Complexidade do espaço: ,