从零开始的力扣刷题记录-第七十八天

力扣每日四题

  • 884. 两句话中的不常见单词-简单
  • 2236. 判断根结点是否等于子结点之和-简单
  • 139. 单词拆分-中等
  • 2679. 矩阵中的和-中等
  • 总结

884. 两句话中的不常见单词-简单

题目描述:
句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。
如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。
给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。

题解:
哈希表,实际上就是统计只出现一次的单词,两个字符串都遍历一遍存入哈希表最后再遍历哈希表即可

代码(Go):

func uncommonFromSentences(s1 string, s2 string) []string {
    dict := map[string]int{}
    re := []string{}
    temps1 := strings.Split(s1," ")
    temps2 := strings.Split(s2," ")
    for _,v := range temps1{
        dict[v]++
    }
    for _,v := range temps2{
        dict[v]++
    }
    for i,v := range dict{
        if v == 1{
            re = append(re,i)
        }
    }
    return re
}

2236. 判断根结点是否等于子结点之和-简单

题目描述:
给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。
如果根结点值等于两个子结点值之和,返回 true ,否则返回 false 。

题解:
意义不明的一道白送题

代码(Go):

func checkTree(root *TreeNode) bool {
    return root.Val == root.Left.Val + root.Right.Val
}

139. 单词拆分-中等

题目描述:
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

题解:
dp[i]表示以第i个字符结尾的字符串能否被字典中的单词表示,将字典中的单词存入哈希表,遍历每个字符,判断所有以它结尾的子字符串是否可以在字典找到,如果可以那么它的dp值就等于以它减去单词长度的那个字符的dp值

代码(Go):

func wordBreak(s string, wordDict []string) bool {
    dp := make([]bool,len(s) + 1)
    dp[0] = true
    dict := map[string]int{}
    for _,v := range wordDict{
        dict[v] = 1
    }
    for i := 1;i <= len(s);i++{
        for j := 0;j < i;j++{
            if dict[s[j:i]] == 1{
                if dp[j] == true{
                    dp[i] = true
                }
            }
        }
    }
    return dp[len(s)]
}

2679. 矩阵中的和-中等

题目描述:
给你一个下标从 0 开始的二维整数数组 nums 。一开始你的分数为 0 。你需要执行以下操作直到矩阵变为空:
矩阵中每一行选取最大的一个数,并删除它。如果一行中有多个最大的数,选择任意一个并删除。
在步骤 1 删除的所有数字中找到最大的一个数字,将它添加到你的 分数 中。
请你返回最后的 分数 。

题解:
暴力模拟。我写的时候没优化,可以用优先队列或者排序把O(mnn)的时间复杂度降低到O(mnlogn)

代码(Go):

func matrixSum(nums [][]int) int {
    re := 0
    for k := 0;k < len(nums[0]);k++{
        temp := -1
        for i := 0;i < len(nums);i++{
            tempi := -1
            for j := 0;j < len(nums[0]);j++{
                if nums[i][j] > tempi{
                    tempi = nums[i][j]
                }
            }
            for j := 0;j < len(nums[0]);j++{
                if nums[i][j] == tempi{
                    nums[i][j] = -1
                    break
                }
            }
            if tempi > temp{
                temp = tempi
            }
        }
        re += temp
    }
    return re
}

总结

基础篇的动态规划就刷到这了,剩下还有好几道没做出来的题,字符串和树的动态规划只各做出了一道,等之后再回来做

你可能感兴趣的:(leetcode刷题,leetcode,算法,golang)