鱼C论坛

 找回密码
 立即注册
查看: 2430|回复: 60

[已解决]Python:每日一题 378

[复制链接]
发表于 2020-4-17 18:38:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2020-4-17 18:47 编辑

今天的题目:


和谐数组是指一个数组里元素的最大值和最小值之间的差距正好是 1 的数组。

给定一个整数数组,在这个数组所有为和谐数组的子序列中找到最长的和谐子序列的长度。

示例:

输入:[1, 3, 2, 2, 5, 2, 3, 7]
输出:5
解释:最长的和谐数组是:[3, 2, 2, 2, 3] 。


欢迎大家一起答题!
最佳答案
2020-4-17 18:52:34
本帖最后由 永恒的蓝色梦想 于 2020-4-17 21:35 编辑

方法超级捞
class Solution:
    def findLHS(self, nums: List[int]) -> int:
        map=collections.Counter(nums)
        max=0

        for i,j in map.items():
            i=map[i+1]

            if i:
                j+=i

                if j>max:
                    max=j

        return max

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-17 18:47:16 | 显示全部楼层
本帖最后由 kinkon 于 2020-4-17 20:00 编辑

试试看能不能通过,速度应该是很慢的
from collections import Counter
def f378(nums):
    res = Counter(nums)
    res = sorted(res.items())
    out,stack = 0, []
    for val, c in res:       
        #print(stack)
        if len(stack) == 1:
            if val - 1 == stack[-1][0]:
                out = max(out, c + stack[-1][1])        
            stack.pop()
        stack.append([val, c])
    return out

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 18:52:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 永恒的蓝色梦想 于 2020-4-17 21:35 编辑

方法超级捞
class Solution:
    def findLHS(self, nums: List[int]) -> int:
        map=collections.Counter(nums)
        max=0

        for i,j in map.items():
            i=map[i+1]

            if i:
                j+=i

                if j>max:
                    max=j

        return max

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:21:35 | 显示全部楼层
本帖最后由 March2615 于 2020-4-17 20:09 编辑

from collections import Counter


def daily378(nums: list) -> int:
    # 解题思路:
    # 首先对nums元素进行计数
    # 如果两元素差1,则返回两者个数之和
    count_nums = Counter(nums)
    result = 0
    set_nums = set(nums)
    for num in set_nums:
        if num + 1 in set_nums:
            result = max(result, count_nums[num] + count_nums[num+1])
    return result

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:28:37 From FishC Mobile | 显示全部楼层
占楼
偷偷的想到双指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:30:02 From FishC Mobile | 显示全部楼层
……我觉得你可以自己出题,不用在力扣上找……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:38:22 | 显示全部楼层
_2_ 发表于 2020-4-17 19:28
占楼
偷偷的想到双指针

子序列,和双指针没半毛钱关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:39:33 | 显示全部楼层
一定要连续的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:40:23 | 显示全部楼层
本帖最后由 kinkon 于 2020-4-17 20:21 编辑

优化一下
def f378(nums):
    res = Counter(nums)
    out = 0
    for val, c in res.items():       
        if val - 1 in res:
            out = max(out, c + res[val - 1])        
    return out

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:53:54 | 显示全部楼层
我可能要30分钟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:57:08 | 显示全部楼层
kinkon 发表于 2020-4-17 18:47
试试看能不能通过

我觉得最好用内置函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 20:03:10 | 显示全部楼层
小甲鱼de粉丝 发表于 2020-4-17 19:57
我觉得最好用内置函数

多谢提醒,Counter原来也是内置函数,用字典也可以实现这个功能,代码比较多,当练习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 20:08:51 | 显示全部楼层
kinkon 发表于 2020-4-17 20:03
多谢提醒,Counter原来也是内置函数,用字典也可以实现这个功能,代码比较多,当练习了

嗯,一起学习吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 20:13:33 | 显示全部楼层
本帖最后由 TJBEST 于 2020-4-18 18:20 编辑

这个可能超时
def fun378(arr):
    dictionary = dict()
    for each in arr:
        try:
            dictionary[each] += 1
        except:
            dictionary[each] = 1
    method = list(dictionary.items())
    method.sort()
    previous = method[0]
    Num = previous[1]
    for temp in method[1:]:
        if temp[0] - previous[0] == 1:
            if temp[1] + previous[1] > Num:
                Num = temp[1] + previous[1]
            else:
                pass
        else:
            if temp[1]> Num:
                Num = temp[1]
            else:
                pass
        previous = temp
    return Num
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 20:13:55 | 显示全部楼层
我就纳闷了,为什么速度会差这么多,明明都是差不都的方法,
是从不同地方读取的速度不一样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-17 20:17:31 | 显示全部楼层
March2615 发表于 2020-4-17 20:13
我就纳闷了,为什么速度会差这么多,明明都是差不都的方法,
是从不同地方读取的速度不一样吗?

力扣的测速都不太准确,所以我有时用 unittest 测
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 20:39:58 | 显示全部楼层
zltzlt 发表于 2020-4-17 20:17
力扣的测速都不太准确,所以我有时用 unittest 测

我想着这么简单就去力扣通过了再来
结果老是给我说超时
看完答案后发现就是for _ in _ 的不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 21:10:46 | 显示全部楼层
本帖最后由 fan1993423 于 2020-4-17 22:20 编辑
from collections import Counter
def fun378(lst):
    result=0
    c=sorted(Counter(lst).items(),reverse=True)
    for i in range(len(c)-1):
        if c[i][0]-c[i+1][0]==1:
            result=max(result,c[i][1]+c[i+1][1])
    return result

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 21:26:34 | 显示全部楼层
我这个如果运气好,也许第一个i就能出答案哦,另外版主能不能314,349测一下,我最近想出来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 21:40:09 From FishC Mobile | 显示全部楼层
本帖最后由 kinkon 于 2020-4-17 21:45 编辑
fan1993423 发表于 2020-4-17 21:10


按数量排序有可能会出错,例如,[1,2,2,3,2,6,2,2,7,7,7,7,7]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 16:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表