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

力扣每日四题

  • 1331. 数组序号转换-简单
  • 2423. 删除字符使频率相同-简单
  • 1884. 鸡蛋掉落-两枚鸡蛋-中等
  • 413. 等差数列划分-中等
  • 总结

1331. 数组序号转换-简单

题目描述:
给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。
序号代表了一个元素有多大。序号编号的规则如下:
序号从 1 开始编号。
一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。
每个数字的序号都应该尽可能地小。

题解:
排序后用哈希表保存排序,再遍历数组根据哈希表更改数值

代码(Go):

func arrayRankTransform(arr []int) []int {
    temp := append([]int{}, arr...)
    sort.Ints(temp)
    dict := map[int]int{}
    num := 1
    for _, v := range temp {
        if _, ok := dict[v];!ok {
            dict[v] = num
            num++
        }
    }
    for i, v := range arr {
        arr[i] = dict[v]
    }
    return arr
}

2423. 删除字符使频率相同-简单

题目描述:
给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。
如果删除一个字母后,word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。
注意:
字母 x 的 频率 是这个字母在字符串中出现的次数。
你 必须 恰好删除一个字母,不能一个字母都不删除。

题解:
这个题看起来简单但实际上很坑,如果直接统计完频率就开始对比的话会有非常多种情况,ifelse几十行都写不完,特别复杂。通过统计频率的频率,模拟删除每一个频率的频率减一,频率减一的频率加一后,计算哈希表的长度,如果等于1就返回true

代码(Go):

func equalFrequency(word string) bool {
    arr := [26]int{}
    for _,v := range word {
        arr[v - 'a']++
    }
    dict := map[int]int{}
    for _,v := range arr {
        if v > 0 {
            dict[v]++
        }
    }
    for _,v := range arr {
        if v == 0 {
            continue
        }
        dict[v]--
        if dict[v] == 0{
            delete(dict,v)
        }
        if v - 1 > 0 {
            dict[v - 1]++
        }
        if len(dict) == 1 {
            return true
        }
        if v - 1 > 0 {
            dict[v - 1]--
            if dict[v - 1] == 0 {
                delete(dict,v - 1)
            }
        }
        dict[v]++
    }
    return false
}

1884. 鸡蛋掉落-两枚鸡蛋-中等

题目描述:
给你 2 枚相同 的鸡蛋,和一栋从第 1 层到第 n 层共有 n 层楼的建筑。
已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都 会碎 ,从 f 楼层或比它低 的楼层落下的鸡蛋都 不会碎 。
每次操作,你可以取一枚 没有碎 的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。
请你计算并返回要确定 f 确切的值 的 最小操作次数 是多少?

题解:
如果鸡蛋数量很多的话可以用动态规划,但是这个题只有两个鸡蛋,可以直接用数学方法做

代码(Go):

func twoEggDrop(n int) int {
    for i := 1;i <= n;i++{
        if i*(i + 1)/2 >= n{
            return i
        }
    }
    return -1
}

413. 等差数列划分-中等

题目描述:
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。
子数组 是数组中的一个连续序列。

题解:
动态规划。因为子数组是连续序列,所以可以从前往后对比差值,如果差值相等则前面有几个等差数组就加等差数组的数量再加一

代码(Go):

func numberOfArithmeticSlices(nums []int) int {
    n := len(nums)
    re := 0
    if n == 1 {
        return re
    }
    dif,num := nums[0] - nums[1],0
    for i := 2;i < n;i++{
        if nums[i - 1] - nums[i] == dif {
            num++
        }else{
            dif,num = nums[i - 1] - nums[i],0
        }
        re += num
    }
    return re
}

总结

现在二维的动态规划能看懂一点但不多,自己写着还是很费劲,接下来依旧是动态规划

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