funcnumberOfEmployeesWhoMetTarget(hours []int, target int) (res int) { for _, hour := range hours { if hour >= target { res++ } } return }
2799. 统计完全子数组的数目
暴力:
两次循环,判断每个子数组是否满足要求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
funccountCompleteSubarrays(nums []int) (res int) { set := make(map[int]struct{}) for _, num := range nums { set[num] = struct{}{} } l := len(set) for i := 0; i < len(nums); i++ { cnt := make(map[int]int) for _, x := range nums[i:] { cnt[x]++ iflen(cnt) == l { res++ } } } return res }
滑动窗口:
找到符合条件的滑动窗口 [left,right],此时 right 右侧有 k 个元素,那就有 k+1(滑动窗口本身) 个滑动窗口满足条件
funccountCompleteSubarrays(nums []int)int { set := make(map[int]struct{}) for _, num := range nums { set[num] = struct{}{} } l := len(set) cnt := make(map[int]int) left := 0 res := 0 for _, num := range nums { cnt[num]++ forlen(cnt) == l { // 满足条件,左端点向右移动 x := nums[left] cnt[x]-- if cnt[x] == 0 { delete(cnt, x) } left++ } res += left } return res }
funcmerge(s, t string)string { // 先特判完全包含的情况 if strings.Contains(s, t) { return s } if strings.Contains(t, s) { return t } for i := min(len(s), len(t)); ; i-- { // 枚举:s 的后 i 个字母和 t 的前 i 个字母是一样的 x := s[len(s)-i:] y := t[:i] if x == y { return s + t[i:] } } }
funcminimumString(a string, b string, c string) (res string) { strList := []string{a, b, c} arr := [][]int{{0, 1, 2}, {0, 2, 1}, {1, 0, 2}, {1, 2, 0}, {2, 1, 0}, {2, 0, 1}} for _, a := range arr { s := merge(merge(strList[a[0]], strList[a[1]]), strList[a[2]]) if res == "" || len(s) < len(res) || len(s) == len(res) && s < res { res = s } } return }
funcmearge2(s, t string)string { if strings.Contains(s, t) { return s } if strings.Contains(t, s) { return t } p := t + "#" + s n := len(p) next := make([]int, n) // 通过next计算子串 for i := 1; i < n; i++ { j := next[i-1] for j > 0 && p[i] != p[j] { j = next[j-1] } if p[i] == p[j] { j++ } next[i] = j } // s+t去掉公共子串 return s + t[next[n-1]:] }
const mod int = 1e9 + 7 funccountSteppingNumbers(low string, high string)int { res := (calc(high) - calc(low) + mod) % mod if valid(low) { res = (res + 1) % mod } return res }
funccalc(s string)int { memo := make([][10]int, len(s)) for i := range memo { for j := range memo[i] { memo[i][j] = -1 } } // pre 表示上一个数位的值, isNumber为false,可以忽略 // isLimit 表示当前是否收到了前n位的约束 // isNumber 表示i前面的数值是否填充了数字 var dfs func(i, pre int, isLimit, isNumber bool)int dfs = func(i, pre int, isLimit, isNumber bool) (res int) { if i == len(s) { // 递归结束 if isNumber { return1 } return0// 前面最后一位没填充数字,非法 } // var res int if !isLimit && isNumber { p := &memo[i][pre] if *p >= 0 { return *p } deferfunc() { *p = res }() } if !isNumber { // 可以跳过当前数位 res += dfs(i+1, pre, false, false) } d := 0 if !isNumber { d = 1// 如果前面没有填数字,必须从 1 开始(因为不能有前导零) } up := 9 if isLimit { up = int(s[i] - '0') // 如果前面填的数字都和 s 的一样,那么这一位至多填数字 s[i](否则就超过 s 啦) } for ; d <= up; d++ { if !isNumber || abs(d, pre) == 1 { // 第一位数字随便填,其余必须相差 1 res += dfs(i+1, d, isLimit && d == up, true) } } return res % mod } return dfs(0, 0, true, false) }
// 如果 low 是步进数字,那么多减了1,再加一不回来 funcvalid(s string)bool { for i := 1; i < len(s); i++ { if abs(int(s[i-1]), int(s[i])) != 1 { returnfalse } } returntrue }
funcabs(a, b int)int { if a > b { return a - b } return b - a }