美團2019秋招後臺開發編程題題解
阿新 • • 發佈:2018-09-07
就是 public imp 一行 同時 import ++ 多少 等於
圖的遍歷
題目描述
給定一張包含N個點、N-1條邊的無向連通圖,節點從1到N編號,每條邊的長度均為1。假設你從1號節點出發並打算遍歷所有節點,那麽總路程至少是多少?
輸入
第一行包含一個整數N,1≤N≤105。
接下來N-1行,每行包含兩個整數X和Y,表示X號節點和Y號節點之間有一條邊,1≤X,Y≤N。
輸出
輸出總路程的最小值。
樣例輸入
4
1 2
1 3
3 4
樣例輸出
4
Hint
按1->2->1->3->4的路線遍歷所有節點,總路程為4。
思路
遍歷所有節點類似於深度優先搜索,也就是說除了最後一條路徑外,走了兩遍,設最後一條路徑為depth,總分支數為N-1,總路徑=2 * (N-1-x)+x=2 * N - 2 - depth,當depth最大時總路徑最小,所以轉化為求二叉樹的深度。
代碼實現
package meituan; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[] t = new int[100005]; int x, y; for (int i = 0; i < N - 1; i++) { x = sc.nextInt(); y = sc.nextInt(); t[y] = t[x] + 1; } int depth = 0; for (int i = 1; i <= N; i++) { depth = t[i] > depth ? t[i] : depth; } System.out.println(2 * N - 2 - depth); } }
區間統計
題目描述
小明拿到了一個數列a1 , a2 , ... an ,小明想知道存在多少個區間[l,r]同時滿足下列兩個條件:
1、r-l+1=k;
2、在a l , a l+1,...ar中,存在一個數至少出現了 t 次。
輸出滿足條件的區間個數。
輸入
輸入第一行三個整數n,k,t(1≤n,k,t≤10^5)。
第二行 n 個整數,a1 , a2 , ... an (1≤ai≤10^5)。
輸出
輸出一個數,問題的答案。
樣例輸入
5 3 2
3 1 1 1 2
樣例輸出
3
Hint
區間[1,3]中1出現了2次,區間[2,4]中1出現了3次,區間[3,5]中1出現了2次。所以一共有3個區間滿足條件。
思路
滑動窗口維護區間中數字出現大於等於t次的個數
代碼實現
package meituan;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int t = sc.nextInt();
if (k > n || t > n) {
System.out.println(0);
}
int[] num = new int[n];
int[] ct = new int[n];
int cnt = 0;
int ans = 0;
for (int i = 0; i < n; ++i) {
num[i] = sc.nextInt();
}
for (int i = 0; i < k - 1; i++) {
ct[num[i]]++;
if (ct[num[i]] >= t && ct[num[i]] - 1 < t) {
cnt++;
}
}
for (int i = k - 1; i < n; i++) {
ct[num[i]]++;
if (ct[num[i]] >= t && ct[num[i]] - 1 < t) {
cnt++;
}
if (cnt > 0) {
ans++;
}
ct[num[i - k + 1]]--;
if (ct[num[i - k + 1]] < t && ct[num[i - k + 1]] + 1 >= t) {
cnt--;
}
}
System.out.println(ans);
}
}
美團2019秋招後臺開發編程題題解