dengxinyi 6 years ago
parent
commit
400f4a3d4b

+ 27 - 0
medium/318.maximum-product-of-word-lengths.go

@@ -0,0 +1,27 @@
+type pair struct {
+	_1 int
+	_2 int
+}
+
+func maxProduct(words []string) (product int) {
+	n := len(words)
+	if n <= 1 {
+		return
+	}
+	pairs := make([]pair, n)
+	for i := 0; i < n; i++ {
+		mask, l := 0, len(words[i])
+		for j := 0; j < l; j++ {
+			mask |= 1 << uint(words[i][j]-'a')
+		}
+		pairs[i] = pair{mask, l}
+	}
+	for i := 0; i < n-1; i++ {
+		for j := i + 1; j < n; j++ {
+			if pairs[i]._1&pairs[j]._1 == 0 && product < pairs[i]._2*pairs[j]._2 {
+				product = pairs[i]._2 * pairs[j]._2
+			}
+		}
+	}
+	return
+}

+ 18 - 0
medium/319.bulb-switcher.go

@@ -0,0 +1,18 @@
+func bulbSwitchSlow(n int) (res int) { // Brute search, TLE
+	bulbs := make([]bool, n)
+	for i := 1; i <= n; i++ {
+		for j := i-1; j < n; j += i {
+			bulbs[j] = !bulbs[j]
+		}
+	}
+	for i := 0; i < n; i++ {
+		if bulbs[i] {
+			res++
+		}
+	}
+	return
+}
+
+func bulbSwitch(n int) int { // Math
+	return int(math.Sqrt(float64(n)))
+}

+ 22 - 0
medium/322.coin-change.go

@@ -0,0 +1,22 @@
+func coinChange(coins []int, amount int) int {
+	dp := make([]int, amount+1)
+	for i := 1; i <= amount; i++ { // dp[0] is 0
+		dp[i] = amount + 1
+	}
+	for _, coin := range coins {
+		for i := coin; i <= amount; i++ {
+			dp[i] = minInt(dp[i], dp[i-coin]+1)
+		}
+	}
+	if amount < dp[amount] {
+		return -1
+	}
+	return dp[amount]
+}
+
+func minInt(x, y int) int {
+	if x < y {
+		return x
+	}
+	return y
+}

+ 50 - 0
medium/324.wiggle-sort-ii.go

@@ -0,0 +1,50 @@
+func wiggleSort(nums []int) {
+	n := len(nums)
+	if n <= 1 {
+		return
+	}
+	mid := quickSelect(nums, n/2)
+	idx := func(i int) int {
+		return (2*i + 1) % (n | 1)
+	}
+	l, m, r := 0, 0, n-1
+	for m <= r {
+		if mid < nums[idx(m)] {
+			swap(&nums[idx(l)], &nums[idx(m)])
+			l, m = l+1, m+1
+		} else if nums[idx(m)] < mid {
+			swap(&nums[idx(m)], &nums[idx(r)])
+			r--
+		} else {
+			m++
+		}
+	}
+}
+
+func quickSelect(nums []int, k int) int {
+	l, r := 0, len(nums)-1
+	rand.Seed(time.Now().Unix())
+	for l < r {
+		swap(&nums[l], &nums[rand.Intn(r-l+1)+l])
+		m := l
+		for i := l + 1; i <= r; i++ {
+			if nums[i] < nums[l] {
+				m++
+				swap(&nums[m], &nums[i])
+			}
+		}
+		swap(&nums[l], &nums[m])
+		if k <= m {
+			r = m - 1
+		}
+		if m <= k {
+			l = m + 1
+		}
+	}
+	return nums[k]
+}
+
+func swap(x, y *int) {
+	*x, *y = *y, *x
+}
+