dengxinyi 6 лет назад
Родитель
Сommit
1eb906588b
2 измененных файлов с 83 добавлено и 0 удалено
  1. 35 0
      medium/688.knight-probability-in-chessboard.go
  2. 48 0
      medium/692.top-k-frequent-words.go

+ 35 - 0
medium/688.knight-probability-in-chessboard.go

@@ -0,0 +1,35 @@
+var detX = []int{1, -1, 1, -1, 2, -2, 2, -2}
+var detY = []int{2, 2, -2, -2, 1, 1, -1, -1}
+
+func knightProbability(N int, K int, r int, c int) float64 {
+	dp := make([][]float64, N)
+	for i := range dp {
+		dp[i] = make([]float64, N)
+	}
+	dp[r][c] = 1.0
+	for i := 0; i < K; i++ {
+		ndp := make([][]float64, N)
+		for j := range ndp {
+			ndp[j] = make([]float64, N)
+		}
+		for y := 0; y < N; y++ {
+			for x := 0; x < N; x++ {
+				for j := 0; j < 8; j++ {
+					ny, nx := y+detY[j], x+detX[j]
+					if ny < 0 || N <= ny || nx < 0 || N <= nx {
+						continue
+					}
+					ndp[y][x] += dp[ny][nx] / 8.0
+				}
+			}
+		}
+		dp = ndp
+	}
+	prob := 0.0
+	for i := range dp {
+		for _, p := range dp[i] {
+			prob += p
+		}
+	}
+	return prob
+}

+ 48 - 0
medium/692.top-k-frequent-words.go

@@ -0,0 +1,48 @@
+type pair struct {
+	word string
+	freq int
+}
+
+type minHeap []pair
+
+func (h minHeap) Len() int { return len(h) }
+func (h minHeap) Less(i, j int) bool {
+	if h[i].freq != h[j].freq {
+		return h[i].freq < h[j].freq
+	}
+	return h[j].word < h[i].word
+}
+func (h minHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
+
+func (h *minHeap) Push(x interface{}) {
+	*h = append(*h, x.(pair))
+}
+
+func (h *minHeap) Pop() interface{} {
+	l := h.Len()
+	x := (*h)[l-1]
+	*h = (*h)[:l-1]
+	return x
+}
+
+func topKFrequent(words []string, k int) []string {
+	m := make(map[string]int)
+	for _, word := range words {
+		m[word]++
+	}
+	i := 0
+	var h minHeap
+	for word, freq := range m {
+		heap.Push(&h, pair{word, freq})
+		i++
+		if k < i {
+			heap.Pop(&h)
+		}
+	}
+	res := make([]string, k)
+	for i = k - 1; 0 <= i; i-- {
+		p := heap.Pop(&h).(pair)
+		res[i] = p.word
+	}
+	return res
+}