其他
字节面试原题,两人都没做出来,都凉了
The following article is from 数据结构和算法 Author 博哥
这题是LeetCode的第525题:连续数组。有两位网友在字节的面试中都遇到这题,不过很遗憾的是他俩都没做出来,至于后来有没有被录取就不知道了。这道题是一道中等难度的题,按说不算太难,下面我们就来看下。
问题描述
难度:中等
输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。
输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。
1 <= nums.length <= 10^5
nums[i] 不是 0 就是 1
问题分析
public int findMaxLength(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
map.put(0, -1);// 前缀和为0的时候,给一个默认值-1。
int preSum = 0, max = 0;
for (int i = 0; i < nums.length; i++) {
// 计算前缀和,原数组中如果是0,就让它变成-1。
preSum += nums[i] == 0 ? -1 : 1;
if (map.containsKey(preSum)) {
// 如果出现相同的前缀和,就计算长度,并保存最大值。
max = Math.max(max, i - map.get(preSum));
} else {
// 如果没有出现相同的前缀和,就把它存起来。
map.put(preSum, i);
}
}
return max;
}
public:
int findMaxLength(vector<int>& nums) {
unordered_map<int, int> mp ;
mp[0]= -1;// 前缀和为0的时候,给一个默认值-1。
int preSum = 0, maxLength = 0;
for (int i = 0; i < nums.size(); i++) {
// 计算前缀和,原数组中如果是0,就让它变成-1。
preSum += nums[i] == 0 ? -1 : 1;
if (mp.count(preSum)) {
// 如果出现相同的前缀和,就计算长度,并保存最大值。
maxLength = max(maxLength, i - mp[preSum]);
} else {
// 如果没有出现相同的前缀和,就把它存起来。
mp[preSum]= i;
}
}
return maxLength;
}