森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 answers 中,其中 answers[i] 是第 i 只兔子的回答。
给你数组 answers ,返回森林中兔子的最少数量。
解题思路:
贪心算法。还是比较简单的。
funcnumRabbits(answers []int)int { // 排序 sort.Ints(answers) ans := 0 for i := 0; i < len(answers); { cur := answers[i] j := i + 1 for j < len(answers) && answers[j] == cur && j-i <= cur { j++ } ans += cur + 1 i = j } return ans }
funclengthOfLongestSubstring(s string)int { m := map[byte]int{} r, ans := -1, 0 for i := 0; i < len(s); i++ { if i != 0 { delete(m, s[i-1]) } for r+1 < len(s) && m[s[r+1]] == 0 { m[s[r+1]]++ r++ } ans = max(ans, r-i+1) } return ans }
for i := 0; i < len(nums); i++ { // in if !st[i] { t = append(t, nums[i]) st[i] = true dfs(cur + 1) // 回溯 st[i] = false t = t[:len(t)-1] } } } dfs(0) return ans }
funclargestNumber(nums []int)string { sort.Slice(nums, func(i, j int)bool { x, y := nums[i], nums[j] sx, sy := 10, 10 for sx <= x { sx *= 10 } for sy <= y { sy *= 10 } // 对比拼接 return sy*x+y > sx*y+x }) if nums[0] == 0 { return"0" } var ans []byte for _, x := range nums { ans = append(ans, strconv.Itoa(x)...) } returnstring(ans) }
funcgenerateParenthesis(n int) []string { ans := make([]string, 0) var dfs func(left, right int, s string) dfs = func(left, right int, s string) { if left == n && right == n { ans = append(ans, s) return } if left < n { dfs(left+1, right, s+"(") } if left > right { dfs(left, right+1, s+")") } } dfs(0, 0, "") return ans }
有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中 省份 的数量。
并查集 或者 dfs 也可以
funcfindCircleNum(isConnected [][]int)int { // ans := 0 p := make([]int, len(isConnected)) hmap := make(map[int]struct{}) // init p for i := 0; i < len(isConnected); i++ { p[i] = i }
var find func(i int)int var union func(i, j int) //var check func(i, j int) bool
find = func(i int)int { if p[i] == i { return i } else { p[i] = find(p[i]) return p[i] } }
union = func(i, j int) { u := find(i) v := find(j) if u == v { return } p[u] = v }
//check = func(i, j int) bool { // u := find(i) // v := find(j) // return u == v //}
// for for i := 0; i < len(isConnected); i++ { for j := i + 1; j < len(isConnected); j++ { if isConnected[i][j] == 1 { union(i, j) } } }
// get ans for i := 0; i < len(p); i++ { // get parent to check parent := find(i) if _, ok := hmap[parent]; !ok { ans++ hmap[parent] = struct{}{} } } return ans }
funcfindCircleNum(isConnected [][]int)int { n := len(isConnected) visited := make([]int, n) ans := 0 var dfs func(i int) dfs = func(i int) { for j := 0; j < n; j++ { if isConnected[i][j] == 1 && visited[j] == 0 { visited[j] = 1 dfs(j) } } }
for i := 0; i < n; i++ { if visited[i] == 0 { dfs(i) ans++ } } return ans }
funclongestPalindrome(s string)string { ans := "" for i := 0; i < len(s); i++ { s1 := logest(s, i, i) s2 := logest(s, i, i+1) iflen(s1) >= len(s2) { ans = s1 } else { ans = s2 } } return ans }
funclogest(s string, i, j int)string { for i >= 0 && j < len(s) && s[i] == s[j] { i-- j++ } return s[i+1 : j] }
// 动态规划 funclongestPalindrome(s string)string { size := len(s) if size < 2 { return s } dp := make([][]bool, size) maxStart, maxEnd, maxLen := 0, 0, 1 for i := 0; i < size; i++ { dp[i] = make([]bool, size) }
for r := 1; r < size; r++ { for l := 0; l < r; l++ { if s[l] == s[r] && (r - l <= 2 || dp[l+1][r-1]) { dp[l][r] = true if r-l+1 > maxLen { maxLen = r - l + 1 maxStart = l maxEnd = r } } } } return s[maxStart:maxEnd+1] }
// 二分 + dp // 贪心 + 二分 [10,9,2,5,3,7,101,18] [0,1,0,3,2,3] funclengthOfLIS1(nums []int)int { dp := make([]int, 0) for _, v := range nums { l := twoDivide(dp, v) if l == len(dp) { dp = append(dp, v) } else { // 当前元素 v 可以替换原有的元素 dp[l] = v } } returnlen(dp) }
// 0 1 2 3
functwoDivide(nums []int, target int)int { l := 0 r := len(nums) - 1 for l <= r { // 0, 1 l = 0 mid := l + (r-l)/2 if nums[mid] >= target { r = mid - 1 } else { l = mid + 1 } } return l }
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
贪心 + 双指针
考虑怎么才能装最多的水即可
l,r 怎么移动, 肯定是移动高度小的,才能使得装更多的水
funcmaxArea(height []int)int { l, r := 0, len(height)-1 ans := 0 for l < r { // update ans = max(ans, (r-l)*min(height[l], height[r])) if height[l] <= height[r] { l++ } else { r-- } } return ans }