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

文章介绍了四道力扣(LeetCode)的算法题目,包括数组元素和与数字和的绝对差、期望个数统计、飞机座位分配概率以及使二叉树所有路径值相等的最小代价问题。解题策略涉及模拟、哈希表、概率计算和递归,其中二叉树问题提供了非递归的动态规划解决方案。
摘要由CSDN通过智能技术生成

2535. 数组元素和与数字和的绝对差-简单

题目描述:
给你一个正整数数组 nums 。
元素和 是 nums 中的所有元素相加求和。
数字和 是 nums 中每一个元素的每一数位(重复数位需多次求和)相加求和。
返回 元素和 与 数字和 的绝对差。
注意:两个整数 x 和 y 的绝对差定义为 |x - y| 。

题解:
按题意模拟整个过程即可

代码(Go):

func differenceOfSum(nums []int) int {
    sum := 0
    sumnum := 0
    for _,v := range nums{
        temp := v
        sum += temp
        for temp > 0{
            sumnum += temp%10
            temp /= 10
        }
    }
    if sum > sumnum{
        return sum - sumnum
    }
    return sumnum - sum
}

LCP 11. 期望个数统计-简单

题目描述:
某互联网公司一年一度的春招开始了,一共有 n 名面试者入选。每名面试者都会提交一份简历,公司会根据提供的简历资料产生一个预估的能力值,数值越大代表越有可能通过面试。
小 A 和小 B 负责审核面试者,他们均有所有面试者的简历,并且将各自根据面试者能力值从大到小的顺序浏览。由于简历事先被打乱过,能力值相同的简历的出现顺序是从它们的全排列中等可能地取一个。现在给定 n 名面试者的能力值 scores,设 X 代表小 A 和小 B 的浏览顺序中出现在同一位置的简历数,求 X 的期望。

题解:
通过概率学的知识可知,这题实际上就是求有多少数值不同的简历,直接哈希表即可

代码(Go):

func expectNumber(scores []int) int {
    dict := map[int]int{}
    for _,v := range scores{
        dict[v]++
    }
    re := 0
    for _,v := range dict{
        if v != 0{
            re++
        }
    }
    return re
}

1227. 飞机座位分配概率-中等

题目描述:
有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。
剩下的乘客将会:
如果他们自己的座位还空着,就坐到自己的座位上,
当他们自己的座位被占用时,随机选择其他座位
第 n 位乘客坐在自己的座位上的概率是多少?

题解:
这题试了一下其实就能猜出来了,只有三种情况,第一位乘客坐在自己的位置,第n位乘客的位置,剩下n-2个位置中随意选一个,第三种情况又会转移到被抢占了座位的乘客,计算后除了n=1的情况其他时候概率都是0.5

代码(Go):

func nthPersonGetsNthSeat(n int) float64 {
    if n == 1 {
        return 1.0
    }
    return 0.5
}

2673. 使二叉树所有路径值相等的最小代价-中等

题目描述:
给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子 2 * i 和右孩子 2 * i + 1 。
树中每个节点都有一个值,用下标从 0 开始、长度为 n 的整数数组 cost 表示,其中 cost[i] 是第 i + 1 个节点的值。每次操作,你可以将树中 任意 节点的值 增加 1 。你可以执行操作 任意 次。
你的目标是让根到每一个 叶子结点 的路径值相等。请你返回 最少 需要执行增加操作多少次。
注意:
满二叉树 指的是一棵树,它满足树中除了叶子节点外每个节点都恰好有 2 个节点,且所有叶子节点距离根节点距离相同。
路径值 指的是路径上所有节点的值之和。

题解:
递归判断左子树和右子树的路径差值并加入结果中,同时自身节点要加上子结点中更大的值来继续向上比较。力扣题解中有人使用从后往前(从n/2)开始向前遍历的方式,可以不使用递归,直接for循环解决问题,消耗的时间空间更少

代码(Go):

func minIncrements(n int, cost []int) int {
    re := 0
    var dfs func(root int) int 
    dfs = func(root int) int {
        if root * 2 < n{
            left := dfs(root*2)
            right := dfs(root*2+1)
            if left > right{
                temp := left - right
                re += temp
                cost[root-1] += left
                return cost[root-1]
            }else{
                temp := right - left
                re += temp
                cost[root-1] += right
                return cost[root-1]
            }
        }else{
            return cost[root-1]
        }
    }
    _ = dfs(1)
    return re
}

总结

今天的两道中等题虽然在动态规划专栏里但是最后解题都没用动态规划,但是第二道中等题的力扣题解中的从后往前的遍历其实就是动态规划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值