dengxinyi 6 роки тому
батько
коміт
d616341b30
2 змінених файлів з 94 додано та 0 видалено
  1. 35 0
      hard/466.count-the-repetitions.go
  2. 59 0
      hard/480.sliding-window-median.go

+ 35 - 0
hard/466.count-the-repetitions.go

@@ -0,0 +1,35 @@
+func getMaxRepetitions(s1 string, n1 int, s2 string, n2 int) int {
+	// dp[i][k] = dp[i][k-1] + dp[(i+dp[i][k-1])%m][k-1], m = len(s1)
+	// dp[i][k] means the length required to match 2^k of s2
+	// from the ith char of s1.
+	m, n := len(s1), len(s2)
+	r1, r2 := []rune(s1), []rune(s2)
+	dp := make([][]int, m+1)
+	for i := range dp {
+		dp[i] = make([]int, 31) // 2^30 is the limit, cauz MaxInt32 < 2^31
+	}
+	for i := 0; i < m; i++ {
+		l1, l2 := i, 0
+		for l2 < n { // Match 2^0 of s2
+			for l1 < n1*m && r1[l1%m] != r2[l2] {
+				l1++
+			}
+			l1, l2 = l1+1, l2+1
+		}
+		dp[i][0] = l1 - i
+	}
+	for k := 1; k < 31; k++ {
+		for i := 0; i < m; i++ {
+			dp[i][k] = dp[i][k-1] + dp[(i+dp[i][k-1])%m][k-1]
+		}
+	}
+	ans := int64(0)
+	beg := 0
+	for k := 30; 0 <= k; k-- {
+		for beg+dp[beg%m][k] <= n1*m {
+			ans += 1 << uint(k)
+			beg += dp[beg%m][k]
+		}
+	}
+	return int(ans) / n2
+}

+ 59 - 0
hard/480.sliding-window-median.go

@@ -0,0 +1,59 @@
+type ints []int
+
+func (is ints) search(x int) int {
+	beg, end := 0, len(is)-1
+	for beg <= end {
+		mid := beg + (end-beg)/2
+		if is[mid] < x {
+			beg = mid + 1
+		} else {
+			end = mid - 1
+		}
+	}
+	return beg
+}
+
+func (is *ints) insert(x int) {
+	idx := is.search(x)
+	if n := len(*is); idx == n {
+		*is = append(*is, x)
+	} else {
+		nis := make([]int, n+1)
+		copy(nis, (*is)[:idx])
+		nis[idx] = x
+		copy(nis[idx+1:], (*is)[idx:])
+		*is = nis
+	}
+}
+
+func (is *ints) delete(x int) {
+	idx := is.search(x)
+	if n := len(*is); idx == n-1 {
+		*is = (*is)[:n-1]
+	} else {
+		copy((*is)[idx:], (*is)[idx+1:])
+		*is = (*is)[:n-1]
+	}
+}
+
+func medianSlidingWindow(nums []int, k int) (ans []float64) {
+	n := len(nums)
+	if n < k || k == 0 {
+		return
+	}
+	var win ints = make([]int, 0)
+	for i := 0; i < n; i++ {
+		if k <= i {
+			win.delete(nums[i-k])
+		}
+		win.insert(nums[i])
+		if k-1 <= i {
+			if k%2 == 1 {
+				ans = append(ans, float64(win[k/2]))
+			} else {
+				ans = append(ans, float64(win[k/2-1]+win[k/2])/2.0)
+			}
+		}
+	}
+	return
+}