一种解法的两种实现,自己的实现比较直观,但是绕了一点,时空复杂度增加了。

自己写的

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
}

对比

file

总结

打破思维定势,问问自己是否引入了不必要的变量和中间过程。

最后修改日期: 2022年3月15日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。