news 2026/4/15 15:39:45

Leetcode 剑指 Offer II 158. 库存管理 II

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Leetcode 剑指 Offer II 158. 库存管理 II

题目难度: 简单

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号算法精选里回复剑指offer2就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

仓库管理员以数组 stock 形式记录商品库存表。stock[i] 表示商品 id,可能存在重复。请返回库存表中数量大于 stock.length / 2 的商品 id。

示例 1:

  • 输入:stock = [6, 1, 3, 1, 1, 1]
  • 输出:1

提示:

  • 1 <= stock.length <= 50000
  • 给定数组为非空数组,且存在结果数字

题目思考

  1. 如何不使用额外空间?
  2. 如果题目不保证一定存在多数元素又该怎么办?

解决方案

思路
  • 一个最简单的思路是用一个计数字典存每个数字的出现次数, 找最大的那个即可, 但这需要额外的空间, 不是面试官心目中的理想答案
  • 重新分析题目, 某个数字出现超过一半, 那意味着其他数字的数目之和都小于它, 如果我们将这些不同数字进行两两抵消, 那么最后剩余的那个数字一定是超过一半的那个数字, 这就引出了下面的思路:
    1. 维护一个当前候选者, 以及当前它的计数, 初始化就是数组头一个数字, 计数为 1
    2. 从第二个数字开始遍历数组, 如果当前数字等于候选者, 那么计数值加 1, 否则就减 1 表示抵消了一个数字
    3. 如果此时计数小于 0 的话, 就说明之前的候选者这个时候要被淘汰了, 因为它已经被抵消光了. 所以就重新选择当前的数字作为新的候选者, 同时重置计数值为 1.
    4. 这样最后剩余的那个候选者一定是最终结果, 因为此题的前提是一定存在这样的数字
  • 当然, 如果题目不保证一定存在多数元素, 那么我们在得到最终候选者之后, 需要重新遍历一遍数组并累加其计数, 确保其计数超过一半, 不然的话就说明整个数组没有多数元素. 例如数组[1,2,3], 利用此方法得到的最终候选者为 3, 但它并不是多数元素, 只是恰好最后一个被选出来的候选者而已.
复杂度
  • 时间复杂度O(N)
    • 只需要遍历数组一遍
  • 空间复杂度O(1)
    • 只使用了几个变量
代码
classSolution:definventoryManagement(self,stock:List[int])->int:# 初始化候选者和计数res=stock[0]cnt=1forxinstock[1:]:ifx==res:# 当前元素等于候选者, 计数值+1cnt+=1else:# 否则计数值-1cnt-=1ifcnt<0:# 如果计数值小于0的话, 就说明之前保存的候选者现在被淘汰了, 将当前元素变为新的候选者, 并重置计数值为1res=x cnt=1returnres

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 16:07:57

GitHub 热榜项目 - 日榜(2026-01-17)

GitHub 热榜项目 - 日榜(2026-01-17) 生成于&#xff1a;2026-01-17 统计摘要 共发现热门项目&#xff1a; 9 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜显示AI应用开发正全面渗透工程实践&#xff0c;智能体框架superpowers和agents.md通过标准化方法…

作者头像 李华
网站建设 2026/4/13 19:28:46

学术新次元:书匠策AI如何用“黑科技”重塑本科论文写作

论文写作&#xff0c;是每个本科生必经的“学术成人礼”。但选题撞车、文献迷航、逻辑混乱、格式翻车……这些痛点像无形的枷锁&#xff0c;让无数学生困在“学术新手村”。如今&#xff0c;一款名为书匠策AI的智能工具正以“学术外挂”的姿态&#xff0c;将论文写作从“地狱模…

作者头像 李华
网站建设 2026/4/12 19:49:28

互联网大厂Java面试实战:涵盖Spring Boot、微服务与AI技术

本文以共享经济场景为背景&#xff0c;讲述严肃的面试官与搞笑的水货程序员谢飞机之间的三轮面试问答。面试围绕Java核心语言、构建工具、Web框架、数据库ORM、微服务、缓存、安全、消息队列、AI技术等展开&#xff0c;层层递进&#xff0c;帮助求职者理解技术细节与业务结合。…

作者头像 李华
网站建设 2026/4/15 9:23:25

WorldModel_Theory_002_PPT

1) “部分可观测”到底在说什么 在很多真实问题里&#xff0c;环境内部有个真实状态&#xff08;你看不见&#xff09;&#xff0c;但你能拿到的是一个观测 oto_tot​&#xff08;传感器/图像/日志&#xff09;。 观测的关键特征是&#xff1a;它是对状态的部分描述&#xff0…

作者头像 李华
网站建设 2026/4/14 2:09:18

我让AI读了1000个GitHub测试项目,总结出“最佳实践”

‌一、测试工程的四大支柱‌基于对1000 GitHub 测试项目、科技巨头公开文档及行业实践的深度分析&#xff0c;软件测试的最佳实践已形成清晰的四维框架&#xff1a;维度核心实践代表项目/工具关键价值‌测试架构‌测试金字塔&#xff08;80%单元 15%集成 5%E2E&#xff09;Go…

作者头像 李华