dengxinyi 6 年之前
父節點
當前提交
130787f6b9
共有 2 個文件被更改,包括 95 次插入24 次删除
  1. 28 24
      hard/410.split-array-largest-sum.go
  2. 67 0
      hard/420.strong-password-checker.go

+ 28 - 24
hard/410.split-array-largest-sum.go

@@ -1,33 +1,37 @@
 func splitArray(nums []int, m int) int {
-	n := len(nums)
-	sum := make([]int, n+1)
-	for i := 0; i < n; i++ {
-		sum[i+1] += nums[i] + sum[i]
+	if len(nums) == 0 {
+		return 0
 	}
-	if m == 1 {
-		return sum[n]
+	l, r := nums[0], 0 // max, sum
+	for _, i := range nums {
+		l = maxInt(l, i)
+		r += i
 	}
-	beg, max, target := 0, sum[n]/m, sum[n]/m
-	for i := 0; i < m-1; i++ { // Cut m-1 times
-		l, r := beg, n
-		for l <= r {
-			mid := l + (r-l)/2
-			if target < sum[mid]-sum[beg] {
-				r = mid - 1 // Keep sum[r] - sum[beg] <= target
-			} else {
-				l = mid + 1
-			}
+	for l <= r {
+		mid := l + (r-l)/2
+		if isValid(nums, m, mid) { // res <= mid, mid is big enough
+			r = mid - 1
+		} else { // mid < res
+			l = mid + 1
 		}
-		if val := sum[r] - sum[beg]; val != target && sum[r+1]-sum[beg]-target < target-val {
-			r++
+	}
+	return l
+}
+
+func isValid(nums []int, m, max int) bool {
+	cnt, sum := 1, 0
+	for _, i := range nums {
+		if max < sum+i {
+			sum = i
+			cnt++
+			if m < cnt {
+				return false
+			}
+		} else {
+			sum += i
 		}
-		max = maxInt(max, sum[r]-sum[beg])
-		beg = r
-		target = (sum[n] - sum[beg]) / (m - 1 - i)
-		fmt.Println(r)
 	}
-	fmt.Println(sum, beg, max, target)
-	return maxInt(max, sum[n]-sum[beg])
+	return true
 }
 
 func maxInt(x, y int) int {

+ 67 - 0
hard/420.strong-password-checker.go

@@ -0,0 +1,67 @@
+func strongPasswordChecker(s string) int {
+	// Missing: insert/delete/replace
+	// Too short: insert
+	// Too long: delete
+	// Repeat: insert/delete/replace
+	n := len(s)
+	if n == 0 {
+		return 6
+	}
+	a, A, d, cnt := 1, 1, 1, 0 // Find the cnt of missing and repeat
+	repeat := make([]int, 0)
+	pre := rune(s[0])
+	for _, r := range s {
+		if 'a' <= r && r <= 'z' {
+			a = 0
+		} else if 'A' <= r && r <= 'Z' {
+			A = 0
+		} else if '0' <= r && r <= '9' {
+			d = 0
+		}
+		if r == pre {
+			cnt++
+		} else {
+			if 3 <= cnt {
+				repeat = append(repeat, cnt)
+			}
+			cnt = 1
+			pre = r
+		}
+	}
+	if 3 <= cnt {
+		repeat = append(repeat, cnt)
+	}
+	miss := a + A + d
+	if n < 6 {
+		return miss + maxInt(0, 6-n-miss) // Repeat && missing can be both solved by insert
+	}
+	exceed, m := maxInt(0, n-20), len(repeat)
+	for k := 2; 1 <= k; k-- {
+		for i := 0; i < m && 0 < exceed; i++ {
+			if repeat[i] < 3 || repeat[i]%3 != k-1 {
+				continue
+			}
+			repeat[i] -= minInt(exceed, k)
+			exceed -= k
+		}
+	}
+	for i := 0; i < m; i++ {
+		
+	}
+	return 0
+}
+
+func minInt(x, y int) int {
+	if x < y {
+		return x
+	}
+	return y
+}
+
+func maxInt(x, y int) int {
+	if x < y {
+		return y
+	}
+	return x
+}
+