2022年8月18日- 每日两题坚持一年

code题目链接:https://leetcode.cn/problems/maximum-equal-frequency/submissions/

思路

  • python中 Counter( )为计数函数,广泛应用于数组
  • count为记录x的个数
  • freqCount 为记录次数为 f 数字的个数
  • freqCount[x] * x 即为 此频次出现的个数
  • 以例子为出发点,区分3种不同的情况
class Solution:
    def maxEqualFreq(self, nums) -> int:
        # count 记录x的个数, freqCount 记录出现次数为f数的数目
        count, freqCount = Counter(), Counter()
        maxFeq =  ans = 0
        for i, num in enumerate(nums):
            # 如果这个数存在
            if count[num]:
                # 这个出现次为f的频次需要减1,出现为f+1的频次需要加1
                freqCount[ count[num] ] -= 1
            count[num] += 1
            # count[num]1了,freqCount[count[num]] 的频次需要随之变
            freqCount[ count[num] ] += 1
            # 数字x 最大频次需要更新
            maxFeq = max(maxFeq, count[num])

            # 会有以下三种情况
            # 1.如果最大频次均为1,则最大长度为 i+1, i从0开始,因此需要 +1,例如[1,2,3,4,5]
            if maxFeq == 1:
                ans = max(ans, i+1)
            # 2.最大频次 * 数量 = i, 例如[1,1,1,3]
            if freqCount[maxFeq] * maxFeq == i:
                ans = max(ans, i+1)
            # 3. 次最大频次 * 数量 + 最大频次 * 数量 = i+1(全部数量), 最大频次 = 1, 例如 [1,1,1,2,2,3,3]
            if freqCount[maxFeq] == 1 and freqCount[maxFeq] * maxFeq + freqCount[maxFeq-1] * (maxFeq-1) == i + 1:
                ans = max(ans, i+1)
        return ans
        

图片描述
简图

acwing题目链接:https://www.acwing.com/solution/content/4628/

思想:

  • 归并排序,步骤
  • 直接将列表分为两半,使左右两半均有序
  • 左右两半均有序后,有三个指针,3个数组,依次迭代
  • 终止条件:当列表长度小于等于1时,即返回(否则会陷入到无限循环中)
n = int(input())
list1 = list(map(int, input().split()))

def merge(sequence):
    if len(sequence) <= 1:
        return
    mid = len(sequence) // 2
    # 左侧列表,右侧列表,左开右闭,python的优点
    L = sequence[:mid]
    R = sequence[mid:]

    merge(L)
    merge(R)

    # 指针i,j, k
    i = j = k = 0
    for _ in range(len(sequence)):
        if i < len(L) and j < len(R):
            if L[i] <= R[j]:
                sequence[k] = L[i]
                i += 1
                k += 1
            else:
                sequence[k] = R[j]
                j += 1
                k += 1
        # 右边已经到头了
        elif i < len(L) and j == len(R):
            sequence[k] = L[i]
            i += 1
            k += 1
        # 左边已经到头了
        elif j < len(R) and i == len(L):
            sequence[k] = R[j]
            j += 1
            k += 1

if __name__ == "__main__":
    merge(list1)
    for i in list1:
        print(i, end=' ')

知识点:

  • python列表取子列表为 [:mid] 左闭右开形,直接deep copy
  • print(i, end =’ ')中的end参数,默认为换行,end是以想要的格式来替代
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值