与你交谈系列#1

**封面图片反映了发布时的心情

想从这样的想法开始,有一段时间,我确实有一个习惯,写下我每天遇到的挑战及其潜在的解决方案,无论是我工作的一部分还是空闲时间活动。

从这篇文章开始,我决定推出“与你对话”系列,我会把它们发布在这里(至少现在,最多几天一次),让公众发现它们。

一方面,现在我会时不时地瞥见这里,而不是我结构良好的笔记来修改一些信息,DevCommunity 将处理存储、升序导航和所有其他内容,另一方面,我相信我写的东西这里可能会发现观众不仅仅代表我。快点,我们开始吧

计数出现次数

在使用 DS 时,您经常需要计算值和后记的出现次数,以便以有效的方式查询它们,最好是时间 O(1)。

显然,你可能会想到创建HashTable,然后遍历DS,填充HashTable。这是真的,可能看起来像:

可迭代 = [...]
哈希表 = {}
对于可迭代的值:
    hashtable[值] = hashtable.get(值, 0) + 1

今天我遇到了一种替代方法,该方法可以完美地处理数字列表,从而避免使用哈希表(有时这可能是必要的)。

背后的想法是首先从列表中获取最大值并创建一个新的最大值长度列表,该列表将用作索引映射。

列表_ = [1, 1, 2, 3]
最大_ = 最大(列表_)
索引 = [0] * max_ # [0, 0, 0, 0]

现在,让我们遍历原始列表并映射索引列表中每个值的出现次数。

1.迭代
[1, 1, 2, 3] # 列表
 |

[0, 1, 0, 0] # 索引

2.迭代
[1, 1, 2, 3] # 列表
    |

[0, 2, 0, 0] # 索引

3.迭代
[1, 1, 2, 3] # 列表
       |

[0, 2, 1, 0] # 索引

4.迭代
[1, 1, 2, 3] # 列表
          |

[0, 2, 1, 1] # 索引

刚刚发生了什么。好吧,基本上,我们从原始列表中获取值并将其用作索引列表中的索引(以及索引处的增量值)。

现在,如果我们想使用映射列表表示我们的结果,我们可能会说,有 0 个零,因为在索引 0 处我们有值 0,在索引 1 处我们有值 2,这意味着有 2 个一,在索引 2 处,我们的值为 1,这意味着有 1 个二,等等。

矩阵中的镜像元素

尽管拥有 2 个学士学位和硕士学位,当我发现一个新的数学技巧时,我仍然感到着迷,又名“天哪,这太简单了,而且有效”。

好吧,回到主题,假设你有一个 N*N 的矩阵,你需要反转行和列以获得所有元素的最大总和(逐行)。

矩阵4*4

1 2 3 9
0 9 8 2
5 1 7 4
8 2 6 7  

第一眼看到,或许你甚至不知道从哪里开始。但这是镜像元素的技巧。

矩阵4*4

甲乙乙
CDC
CDC 
甲乙乙

这里的关键点是,矩阵中的 A 可能只能被另一个 A 交换。假设我们位于左上角 A(即 1),我们想知道是否还有另一个更大的 A(仅镜像 A)。事实上,我们确实在右上角(9)有这样的东西。

按照逻辑并回忆一下原始问题(反转行和列的最大和),我们可能会得出结论,实际上我们不需要执行任何反转操作,而只需在镜像中查找最大值即可。就是这样。

堆。时间和空间复杂度之间的权衡。

假设您有一个任务来实现一个只有 3 个功能的堆栈包装器:(1)pop(2)push(3)get_min。您可以使用堆栈接口进行(1)弹出和(2)推送,但仍然需要实现(3)get_min。 Annnd get_min() 应该在 O(1) 时间内工作。

好吧,当我第一次解决这个问题时,我完全忘记了一个权衡,它说:“当你优化时间性能时,空间性能可能会变得更糟,反之亦然”。为什么它很重要,因为我开始考虑优化的 DS,它引导我使用 HashTables,但我真的很怀念朴素列表,它也适用于 O(1)(摊销)。

因此,当我创建一个哈希表时,我可以在其中存储包装类的每个状态……将在此停止,因为“更简单是更好的选择”(有时)。让我们看看使用附加列表来存储堆栈每个状态的最小值的实现。

类包装器:
   def __init__(自身,堆栈):
      self.stack = 堆栈
      self.min = []

   # 时间 O(1)
   def pop(自身):
      self.stack.pop()
      self.min.pop()

   # 时间 O(1)
   def 推送(自身,值):
      self.stack.push(值=值)
      min_ = self.min[-1]
      如果值 < min_:
          最小值_ = 值
      self.min.append(min_)

   # 时间 O(1)
   def get_min(自身):
      返回 self.min[-1]

就这么简单。

结论

  • 继续编码和开发
  • 记住权衡,不要过于复杂(当没有询问你时)

以上就是与你交谈系列#1的详细内容,更多请关注昆居客【www.kunjuke.com】。

相关推荐:

小米 REDMI K100 系列手机获入网许可,消息称支持 100W 有线闪充

感谢网友 顺势而为 的线索投递! 7 月 6 日消息,型号为 M511CD 的小米新机已获入网许可。据博主 @李昂昂昂啊 分享,该机为 REDMI K100 系列,将支持 100W 有线闪充。博主表示,今年下半年的 REDMI K100 系列会全面提速。据此前报道,小米 REDMI K100 系列手机的核心配置已曝光,新机会搭载骁龙 8E5 双芯平台、配备 185Hz 超高刷直屏、拥有超 8000...

华为 Pura 90 系列手机国际版官宣,定档 7 月 14 日在马来西亚吉隆坡发布

感谢网友 肖战割割、不一样的体验 的线索投递! 7 月 6 日消息,华为官方今日宣布,将于 7 月 14 日在马来西亚吉隆坡举行主题为“Now is Your Moment”的旗舰产品发布会,届时将面向国际市场推出 Pura 90 系列手机。据此前报道,在今年 4 月的华为 Pura 系列及全场景新品发布会上,华为常务董事、产品投资评审委员会主任、终端 BG 董事长余承东正式发布了 Pura 90...

消息称小米 REDMI Turbo 5 系列手机销量超 200 万台

感谢网友 不一样的体验 的线索投递! 7 月 6 日消息,据长期关注国内手机市场份额的数码博主 @RD观测 爆料,截至 2026 年第 26 周(6.22-6.28),REDMI Turbo 5 系列手机销量(Sold Out)超 200 万台(约 200.42 万)。博主还公布了 REDMI K90 系列手机的销量:REDMI K90:约 239.13 万REDMI K90 Max:约 41.3...

小米 REDMI Note 系列 12 年全球累计销量破 5 亿台,Note 17 系列本月见

感谢网友 顺势而为、Autumn_Dream、風見暉一、不一样的体验、Alive1、hyy23450305 的线索投递! 7 月 2 日消息,今天上午,@REDMI红米手机 官微宣布:REDMI Note 系列 12 年全球累计销量突破 5 亿台,新一代“小金刚”机型 ——Note 17 系列将于本月发布,持续推动品质、屏幕、续航、体验升级。此前 @数码闲聊站 的消息称,某厂的子系中端走量机暂定 ...

比亚迪 6 月销量明细:元系列超 7 万辆,钛 7 突破 2 万辆

感谢网友 蒂姆OPPO、决明z 的线索投递! 7 月 2 日消息,今天上午,@小迪快报 公布了比亚迪乘用车 2026 年 6 月的销量明细:王朝 | 海洋 340863 辆;方程豹汽车销售 35607 辆;腾势汽车销售 20352 辆;仰望汽车销售 470 辆;海外销售 174897 辆;累计销售 397292 辆。整理如下:王朝:当月 157372 辆,年度累计 713815 辆夏:当月 140...

戴尔推出 2026 款 Dell Pro Precision 5 系列 14S 笔记本:R7 450 + 45% NTSC 1200P 面板,14999 元

感谢网友 华南吴彦祖 的线索投递! 6 月 29 日消息,戴尔现已在京东上架 2026 款 Dell Pro Precision 5 系列 14S 笔记本,该机采用锐龙 AI 7 450 + 32GB RAM + 1TB SSD,定价为 14999 元。该机三面采用铝合金材质,整体厚度 10.8mm,重量 1.4Kg,笔记本 B 面配备一块 1920x1200 分辨率 60Hz IPS 面板(覆盖...

Flip8 恐成系列最后一款:消息称三星 Galaxy Z Flip 将步 Note 系列后尘

感谢网友 华南吴彦祖 的线索投递! 7 月 1 日消息,科技媒体 Wccftech 昨日(6 月 30 日)发布博文,报道称三星 Galaxy Z Flip 系列折叠手机恐步 Galaxy Note 系列后尘,今年发布的 Galaxy Z Flip8 将成系列最后一款机型。在产量目标方面,消息称三星已于 5 月下调 Galaxy Z Flip8 小折叠手机生产计划,而 Galaxy Z Fold8...