dengxinyi 6 年之前
父节点
当前提交
0c37548af9
共有 3 个文件被更改,包括 88 次插入1 次删除
  1. 39 1
      medium/474.ones-and-zeroes.go
  2. 23 0
      medium/477.total-hamming-distance.go
  3. 26 0
      medium/478.generate-random-point-in-a-circle.go

+ 39 - 1
medium/474.ones-and-zeroes.go

@@ -1,3 +1,41 @@
 func findMaxForm(strs []string, m int, n int) int {
-    
+	o := len(strs)
+	dp := make([][][]int, m+1)
+	for i := range dp {
+		dp[i] = make([][]int, n+1)
+		for j := range dp[i] {
+			dp[i][j] = make([]int, o+1)
+		}
+	} // dp[i][j][k] = max(dp[i][j][k-1], dp[i-dm][j-dn][k-1] + 1)
+	for i := 0; i <= m; i++ {
+		for j := 0; j <= n; j++ {
+			for k := 1; k <= o; k++ {
+				dm, dn := zeroAndOne(strs[k-1])
+				if dm <= i && dn <= j {
+					dp[i][j][k] = maxInt(dp[i][j][k-1], dp[i-dm][j-dn][k-1]+1)
+				} else {
+					dp[i][j][k] = dp[i][j][k-1] // Important!
+				}
+			}
+		}
+	}
+	return dp[m][n][o]
+}
+
+func zeroAndOne(s string) (zero, one int) {
+	for _, r := range s {
+		if r == '0' {
+			zero++
+		} else if r == '1' {
+			one++
+		}
+	}
+	return
+}
+
+func maxInt(x, y int) int {
+	if x < y {
+		return y
+	}
+	return x
 }

+ 23 - 0
medium/477.total-hamming-distance.go

@@ -0,0 +1,23 @@
+func totalHammingDistanceSlow(nums []int) (dist int) {
+	n := len(nums)
+	for i := 0; i < n-1; i++ {
+		for j := i + 1; j < n; j++ {
+			dist += bits.OnesCount32(uint32(nums[i] ^ nums[j]))
+		}
+	}
+	return
+}
+
+func totalHammingDistance(nums []int) (dist int) {
+	n := len(nums)
+	for b := 1 << 31; 1 <= b; b >>= 1 {
+		k := 0
+		for _, i := range nums {
+			if b&i == 0 {
+				k++
+			}
+		}
+		dist += k * (n - k) // At pos b, k 0s and n-k 1s inc k*(n-k) dist
+	}
+	return
+}

+ 26 - 0
medium/478.generate-random-point-in-a-circle.go

@@ -0,0 +1,26 @@
+type Solution struct {
+	r float64
+	x float64
+	y float64
+}
+
+func Constructor(radius float64, x_center float64, y_center float64) Solution {
+	return Solution{
+		r: radius,
+		x: x_center,
+		y: y_center,
+	}
+}
+
+func (this *Solution) RandPoint() []float64 {
+	phi := rand.Float64() * 2.0 * math.Pi
+	radius := math.Sqrt(rand.Float64()) * this.r // !!!
+	dx, dy := radius*math.Cos(phi), radius*math.Sin(phi)
+	return []float64{this.x + dx, this.y + dy}
+}
+
+/**
+ * Your Solution object will be instantiated and called as such:
+ * obj := Constructor(radius, x_center, y_center);
+ * param_1 := obj.RandPoint();
+ */