dengxinyi 6 years ago
parent
commit
f534604829

+ 27 - 0
medium/309.best-time-to-buy-and-sell-stock-with-cooldown.go

@@ -0,0 +1,27 @@
+func maxProfit(prices []int) int {
+	//          v-.
+	//        >s0_|rest
+	//       /  \
+	//  rest/    \ buy
+	//     / sell v
+	//    s2<-----s1<.
+	//             |_|rest
+	//
+	n := len(prices)
+	if n <= 1 {
+		return 0
+	}
+	s0, s1, s2 := 0, -prices[0], -1<<32
+	for i := 1; i < n; i++ {
+		s0, s1, s2 = maxInt(s0, s2), maxInt(s0-prices[i], s1), s1+prices[i]
+	}
+	return maxInt(s0, s2)
+}
+
+func maxInt(x, y int) int {
+	if x < y {
+		return y
+	}
+	return x
+}
+

+ 92 - 0
medium/310.minimum-height-trees.go

@@ -0,0 +1,92 @@
+func findMinHeightTreesBFS(n int, edges [][]int) (res []int) { // BFS, start from leaf
+	if n <= 2 {
+		for i := 0; i < n; i++ {
+			res = append(res, i)
+		}
+		return
+	}
+	adj := make([][]int, n)
+	inDegree := make(map[int]int)
+	for i := range edges {
+		a, b := edges[i][0], edges[i][1]
+		adj[a] = append(adj[a], b)
+		adj[b] = append(adj[b], a)
+		inDegree[a]++
+		inDegree[b]++
+	}
+	for 2 < len(inDegree) {
+		li := make([]int, 0)
+		for k, v := range inDegree {
+			if v == 1 {
+				li = append(li, k)
+			}
+		}
+		for _, i := range li {
+			for _, j := range adj[i] {
+				if v, ok := inDegree[j]; ok {
+					inDegree[j] = v - 1
+				}
+			}
+			delete(inDegree, i)
+		}
+	}
+	for k, _ := range inDegree {
+		res = append(res, k)
+	}
+	return
+}
+
+type pair struct {
+	_1 int
+	_2 int
+}
+
+func findMinHeightTrees(n int, edges [][]int) (res []int) {
+	adj := make([][]int, n)
+	for i := range edges {
+		a, b := edges[i][0], edges[i][1]
+		adj[a] = append(adj[a], b)
+		adj[b] = append(adj[b], a)
+	}
+	minDepth := 1<<32 - 1
+	color := make([]int, n)
+	m := make(map[pair]int)
+	for i := 0; i < n; i++ {
+		maxDepth := getDepth(adj, color, i, &m)
+		if maxDepth < minDepth {
+			minDepth = maxDepth
+			res = []int{i}
+		} else if maxDepth == minDepth {
+			res = append(res, i)
+		}
+	}
+	return
+}
+
+func getDepth(adj [][]int, color []int, id int, m *map[pair]int) (depth int) {
+	if len(adj[id]) == 1 && color[adj[id][0]] == 1 {
+		return
+	}
+	color[id] = 1
+	for _, i := range adj[id] {
+		if color[i] != 0 {
+			continue
+		}
+		if d, ok := (*m)[pair{id, i}]; ok {
+			depth = maxInt(depth, d)
+			continue
+		}
+		d := getDepth(adj, color, i, m)
+		(*m)[pair{id, i}] = d
+		depth = maxInt(depth, d)
+	}
+	color[id] = 0
+	return depth + 1
+}
+
+func maxInt(x, y int) int {
+	if x < y {
+		return y
+	}
+	return x
+}

+ 22 - 0
medium/313.super-ugly-number.go

@@ -0,0 +1,22 @@
+func nthSuperUglyNumber(n int, primes []int) int {
+	ugly := []int{1}
+	k := len(primes)
+	index, product := make([]int, k), make([]int, k)
+	copy(product, primes)
+	for i := 1; i < n; i++ {
+		idx, min := 0, product[0]
+		for j := 0; j < k; j++ {
+			if product[j] == ugly[i-1] {
+				index[j]++
+				product[j] = ugly[index[j]] * primes[j]
+			}
+			if product[j] < min {
+				idx, min = j, product[j]
+			}
+		}
+		ugly = append(ugly, min)
+		index[idx]++
+		product[idx] = ugly[index[idx]] * primes[idx]
+	}
+	return ugly[n-1]
+}