zltzlt 发表于 2020-4-17 18:38:40

Python:每日一题 378

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

今天的题目:

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

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

示例:

输入:
输出:5
解释:最长的和谐数组是: 。

{:10_298:}欢迎大家一起答题!{:10_298:}

kinkon 发表于 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]:
                out = max(out, c + stack[-1])      
            stack.pop()
      stack.append()
    return out

永恒的蓝色梦想 发表于 2020-4-17 18:52:34

本帖最后由 永恒的蓝色梦想 于 2020-4-17 21:35 编辑

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

      for i,j in map.items():
            i=map

            if i:
                j+=i

                if j>max:
                  max=j

      return max

March2615 发表于 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 + count_nums)
    return result

_2_ 发表于 2020-4-17 19:28:37

占楼
偷偷的想到双指针

_2_ 发表于 2020-4-17 19:30:02

……我觉得你可以自己出题,不用在力扣上找……

永恒的蓝色梦想 发表于 2020-4-17 19:38:22

_2_ 发表于 2020-4-17 19:28
占楼
偷偷的想到双指针

子序列,和双指针没半毛钱关系

小甲鱼de粉丝 发表于 2020-4-17 19:39:33

一定要连续的吗

kinkon 发表于 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)      
    return out

小甲鱼de粉丝 发表于 2020-4-17 19:53:54

我可能要30分钟

小甲鱼de粉丝 发表于 2020-4-17 19:57:08

kinkon 发表于 2020-4-17 18:47
试试看能不能通过

我觉得最好用内置函数

kinkon 发表于 2020-4-17 20:03:10

小甲鱼de粉丝 发表于 2020-4-17 19:57
我觉得最好用内置函数

多谢提醒,Counter原来也是内置函数,用字典也可以实现这个功能,代码比较多,当练习了

小甲鱼de粉丝 发表于 2020-4-17 20:08:51

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

嗯,一起学习吧

TJBEST 发表于 2020-4-17 20:13:33

本帖最后由 TJBEST 于 2020-4-18 18:20 编辑

这个可能超时
def fun378(arr):
    dictionary = dict()
    for each in arr:
      try:
            dictionary += 1
      except:
            dictionary = 1
    method = list(dictionary.items())
    method.sort()
    previous = method
    Num = previous
    for temp in method:
      if temp - previous == 1:
            if temp + previous > Num:
                Num = temp + previous
            else:
                pass
      else:
            if temp> Num:
                Num = temp
            else:
                pass
      previous = temp
    return Num

March2615 发表于 2020-4-17 20:13:55

我就纳闷了,为什么速度会差这么多,明明都是差不都的方法,
是从不同地方读取的速度不一样吗?

zltzlt 发表于 2020-4-17 20:17:31

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

力扣的测速都不太准确,所以我有时用 unittest 测

March2615 发表于 2020-4-17 20:39:58

zltzlt 发表于 2020-4-17 20:17
力扣的测速都不太准确,所以我有时用 unittest 测

我想着这么简单就去力扣通过了再来
结果老是给我说超时
看完答案后发现就是for _ in _ 的不同

fan1993423 发表于 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-c==1:
            result=max(result,c+c)
    return result

fan1993423 发表于 2020-4-17 21:26:34

我这个如果运气好,也许第一个i就能出答案哦{:5_109:},另外版主能不能314,349测一下,我最近想出来的

kinkon 发表于 2020-4-17 21:40:09

本帖最后由 kinkon 于 2020-4-17 21:45 编辑

fan1993423 发表于 2020-4-17 21:10


按数量排序有可能会出错,例如,
页: [1] 2 3 4
查看完整版本: Python:每日一题 378