每日算法系列【LeetCode 面试题 17.05】字母与数字
题目描述
给定一个放有字符和数字的数组,找到最长的子数组,且包含的字符和数字的个数相同。
返回该子数组,若不存在这样的数组,返回一个空数组。
示例1
输入:
["A","1","B","C","D","2","3","4","E","5","F","G","6","7","H","I","J","K","L","M"]
输出:
["A","1","B","C","D","2","3","4","E","5","F","G","6","7"]
示例2
输入:
["A","A"]
输出:
[]
提示
- array.length <= 100000
题解
回忆之前做过的一道题目:每日算法系列【LeetCode 523】连续的子数组和,是不是有点相似?那道题是要求是否含有总和为 的整数倍的连续子数组。而本题要求的是最长的子数组,满足数字和字母个数相等。
我们可以把字母抽象成 ,数字抽象成 ,那么子数组的总和含义就是数字个数与字母个数的差值。假设子数组 是满足字母个数和数字个数相等的,那么这段子数组总和必然是 。如果我们用前缀和来进行优化的话, ,也就是说 和 的值是相等的。
所以我们只需要求一遍前缀和,如果 没有在之前出现过,那就保存一下 最开始出现的下标是 。否则的话就看一下当前子数组长度 和历史最优的长度 谁大,然后决定更不更新。
实际实现中 c++ 还是可以采用 unordered_map
来当作哈希表保存下标。
时间复杂度是 。
代码
c++
class Solution {public:vector<string> findLongestSubarray(vector<string>& array) {int n = array.size();unordered_map<int, int> mp;mp[0] = -1;int cnt = 0, l = 0, r = 0;for (int i = 0; i < n; ++i) {cnt += isdigit(array[i][0]) ? 1 : -1;if (mp.find(cnt) != mp.end()) {if (r-l < i-mp[cnt]) {l = mp[cnt] + 1;r = i + 1;}} else {mp[cnt] = i;}}return vector<string>(array.begin()+l, array.begin()+r);}
};
python
class Solution:def findLongestSubarray(self, array: List[str]) -> List[str]:mp = {0: -1}cnt, l, r = 0, 0, 0for i, s in enumerate(array):cnt += 1 if s[:1].isdigit() else -1if cnt in mp:if r-l < i-mp[cnt]:l = mp[cnt] + 1r = i + 1else:mp[cnt] = ireturn array[l:r]
每日算法系列【LeetCode 面试题 17.05】字母与数字相关推荐
- 程序员面试金典 - 面试题 17.05. 字母与数字(哈希map+思维转换)
1. 题目 给定一个放有字符和数字的数组,找到最长的子数组,且包含的字符和数字的个数相同. 返回该子数组,若存在多个最长子数组,返回左端点最小的.若不存在这样的数组,返回一个空数组. 示例 1: 输入 ...
- 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符
题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...
- leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排
leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...
- [leetcode 面试题 17.17] -- 多次搜索,KMP与字典树
[leetcode 面试题 17.17] -- 多次搜索 题目来源 分析 KMP思路 完整代码 字典树 完整代码 题目来源 https://leetcode-cn.com/problems/multi ...
- ⭐算法入门⭐《堆》中等01 —— LeetCode 面试题 17.09. 第 k 个数
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 有些数的素因子只有 3 ...
- Leetcode每日一题:面试题17.12 binode
面试题 17.12. BiNode 二叉树的中序遍历是弱项,需要额外练习,特别是二叉搜索树的中序遍历,利用它是递增数列的性质: 通过一个pre来不断地修改节点指向,有左节点优先左节点,没有则右节点,p ...
- 【LeetCode每日一题】——面试题17.21.直方图的水量
文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[解题思路] 七[时间频度] 八[代码实现] 九[提交结果] 一[题目类别] 双指针 二[题目难度] 困难 ...
- LeetCode 面试题 17.16. 按摩师
面试题 17.16. 按摩师 题目:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接.在每次预约服务之间要有休息时间,因此她不能接受相邻的预约.给定一个预约请求序列,替按摩师找到最 ...
- 【每日一题】 面试题 17.14. 最小K个数
面试题 17.14. 最小K个数
- 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...
题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...
最新文章
- postgres 显示变量_postgre 查询时 postgres=# 变成 ! ! 要怎么解决?
- 2011年3月华章新书书讯:ASP.NET本质论、Erlang编程指南、SNS网站构建
- 如何HttpWebRequest模拟登陆,获取服务端返回Cookie以便登录请求后使用
- 数据结构(三)之单链表反向查找
- 关于多条id相同,只取其中一条记录的sql语句
- Kubernetes 1.9集群使用traefik发布服务
- pip安装环境报错[Errno 99] Cannot assign requested address问题解决
- 微信小程序学习笔记-(9)-仿智行火车票
- 鸿蒙os锁屏样式怎么用,怎样设置微信锁屏显示
- java实现的端口映射器
- 用python求圆的表面积_【用python写一组类(class)对应各种几何体(正方体,长方体,球,圆柱)的表面积和体积的编码】作业帮...
- 超鸿蒙 混希夷 寂寥,下列句子与“故凡为愚者.莫我若也 的句式不同的一项是 A.超鸿蒙.混希夷.寂寥而莫我知也 B.而良人未之知也 C.及长.不省所怙.惟兄嫂是依 D.王语暴以好乐...
- 脖子黑色素沉淀怎么去除,有效方法
- 【思维导图怎么画】万彩脑图大师教程 | 插入动画图标
- DeleteObject()
- 浏览器免费安装ChatGPT插件与国内免费ChatGPT分享
- 论Python中注释的重要性
- #18 可视化基础4-簇形柱状图、百分比堆积柱状图、并列子图
- 为什么梦里常有视觉和听觉,却没有痛觉和嗅觉?
- 非计算机专业想学编程语言进入大数据岗位必读书单推荐