最近在网上看到一位字节程序员发的帖子,该程序员今年33岁,税前60+万,在字节搞研发,觉得自己没有晋升机会,绩效也不好,能力也一般,深感中年危机深重。
其实行业危机一直都存在,尤其是在互联网行业会更加明显,年龄大确实是硬伤,但年薪60多万也确实不少了,33岁还可以再干个几年,就算转行也会足够的资金,没必要迷茫。像我们这种年龄比你大,收入还远不如你的大有人在,我们都没迷茫,你有啥可迷茫的。
![]()
![]()
![]()
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第594题:最长和谐子序列,难度是简单。
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是 1 。给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
示例1:
输入:nums = [1,3,2,2,5,2,3,7] 输出:5 解释: 最长和谐子序列是 [3,2,2,2,3]。
示例2:
输入:nums = [1,1,1,1] 输出:0 解释: 不存在和谐子序列。
1 <= nums.length <= 2 * 10^4
-10^9 <= nums[i] <= 10^9
问题分析
和谐子数组就是数组中最大值和最小值相差 1 ,我们可以使用map先统计每个元素出现的次数,然后再遍历每一个数字num,则num和num+1构成的数组就是和谐子数组。我们计算只需要保留和谐子数组的最大长度即可。注意如果计算num的时候,则num+1一定要存在,否则构不成和谐子数组。
JAVA:
public int findLHS(int[] nums) {
Map
mp =
new HashMap<>();
for (int num : nums)// 统计每个元素的个数
mp.put(num, mp.getOrDefault(num, 0) + 1);
int ans = 0;
for (int key : mp.keySet()) {
if (mp.containsKey(key + 1))// 保证最大值和最小值都存在
ans = Math.max(ans, mp.get(key + 1) + mp.get(key));
}
return ans;
}
C++:
public:
int findLHS(vector &nums) {
unordered_map mp;
for (int &num: nums)// 统计每个元素的个数
mp[num]++;
int ans = 0;
for (auto &[num, freq]: mp) {
if (mp.count(num + 1)) // 保证最大值和最小值都存在
ans = max(ans, freq + mp[num + 1]);
}
return ans;
}
笔者简介
博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解900多题,对算法题有自己独特的解题思路和解题技巧。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.