一种解法的两种实现,自己的实现比较直观,但是绕了一点,时空复杂度增加了。
自己写的
func dfs(selected []int, index int, remain *[]int, result *map[int]int){
if index==len(*remain){
val := 0
for _, n := range selected{
val |= n
}
(*result)[val] += 1
return
}
dfs(selected, index+1, remain, result)
dfs(append(selected, (*remain)[index]), index+1, remain, result)
}
func countMaxOrSubsets(nums []int) int {
result := make(map[int]int)
selected := make([]int, 0)
dfs(selected, 0, &nums, &result)
max_count := 0
max_val := 0
for val, count := range(result){
if val > max_val{
max_val = val
max_count = count
}
}
return max_count
}
官方解法
func countMaxOrSubsets(nums []int) int {
maxOr := 0
ans := 0
var dfs func(int, int)
dfs = func(pos, or int){
if pos == len(nums){
if or > maxOr{
maxOr = or
ans = 1
}else if or == maxOr{
ans++
}
}else{
dfs(pos+1, or)
dfs(pos+1, or|nums[pos])
}
return
}
dfs(0, 0)
return ans
}
对比
总结
打破思维定势,问问自己是否引入了不必要的变量和中间过程。
留言