鱼C论坛

 找回密码
 立即注册
查看: 2696|回复: 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 编辑

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

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

  7.             if i:
  8.                 j+=i

  9.                 if j>max:
  10.                     max=j

  11.         return max
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

试试看能不能通过,速度应该是很慢的
  1. from collections import Counter
  2. def f378(nums):
  3.     res = Counter(nums)
  4.     res = sorted(res.items())
  5.     out,stack = 0, []
  6.     for val, c in res:      
  7.         #print(stack)
  8.         if len(stack) == 1:
  9.             if val - 1 == stack[-1][0]:
  10.                 out = max(out, c + stack[-1][1])        
  11.             stack.pop()
  12.         stack.append([val, c])
  13.     return out
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

  7.             if i:
  8.                 j+=i

  9.                 if j>max:
  10.                     max=j

  11.         return max
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. from collections import Counter


  2. def daily378(nums: list) -> int:
  3.     # 解题思路:
  4.     # 首先对nums元素进行计数
  5.     # 如果两元素差1,则返回两者个数之和
  6.     count_nums = Counter(nums)
  7.     result = 0
  8.     set_nums = set(nums)
  9.     for num in set_nums:
  10.         if num + 1 in set_nums:
  11.             result = max(result, count_nums[num] + count_nums[num+1])
  12.     return result
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:28:37 From FishC Mobile | 显示全部楼层
占楼
偷偷的想到双指针
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:30:02 From FishC Mobile | 显示全部楼层
……我觉得你可以自己出题,不用在力扣上找……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

子序列,和双指针没半毛钱关系
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:39:33 | 显示全部楼层
一定要连续的吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

优化一下
  1. def f378(nums):
  2.     res = Counter(nums)
  3.     out = 0
  4.     for val, c in res.items():      
  5.         if val - 1 in res:
  6.             out = max(out, c + res[val - 1])        
  7.     return out
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 19:53:54 | 显示全部楼层
我可能要30分钟
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我觉得最好用内置函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

多谢提醒,Counter原来也是内置函数,用字典也可以实现这个功能,代码比较多,当练习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,一起学习吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个可能超时
  1. def fun378(arr):
  2.     dictionary = dict()
  3.     for each in arr:
  4.         try:
  5.             dictionary[each] += 1
  6.         except:
  7.             dictionary[each] = 1
  8.     method = list(dictionary.items())
  9.     method.sort()
  10.     previous = method[0]
  11.     Num = previous[1]
  12.     for temp in method[1:]:
  13.         if temp[0] - previous[0] == 1:
  14.             if temp[1] + previous[1] > Num:
  15.                 Num = temp[1] + previous[1]
  16.             else:
  17.                 pass
  18.         else:
  19.             if temp[1]> Num:
  20.                 Num = temp[1]
  21.             else:
  22.                 pass
  23.         previous = temp
  24.     return Num
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

力扣的测速都不太准确,所以我有时用 unittest 测
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我想着这么简单就去力扣通过了再来
结果老是给我说超时
看完答案后发现就是for _ in _ 的不同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 21:26:34 | 显示全部楼层
我这个如果运气好,也许第一个i就能出答案哦,另外版主能不能314,349测一下,我最近想出来的
小甲鱼最新课程 -> https://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]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 19:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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