leetcode 525. Contiguous Array 统计1和0相等最长子数组 + map统计index
2017-12-17 09:16
656 查看
Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1.
Example 1:
Input: [0,1]
Output: 2
Explanation: [0, 1] is the longest contiguous subarray with equal number of 0 and 1.
Example 2:
Input: [0,1,0]
Output: 2
Explanation: [0, 1] (or [1, 0]) is a longest contiguous subarray with equal number of 0 and 1.
Note: The length of the given binary array will not exceed 50,000.
这道题给了我们一个二进制的数组,让我们找邻近的子数组使其0和1的个数相等。对于求子数组的问题,我们需要时刻记着求累积和是一种很犀利的工具,但是这里怎么将子数组的和跟0和1的个数之间产生联系呢?我们需要用到一个trick,遇到1就加1,遇到0,就减1,这样如果某个子数组和为0,就说明0和1的个数相等,这个想法真是太叼了,不过博主木有想出来。知道了这一点,我们用一个哈希表建立子数组之和跟结尾位置的坐标之间的映射。如果某个子数组之和在哈希表里存在了,说明当前子数组减去哈希表中存的那个子数字,得到的结果是中间一段子数组之和,必然为0,说明0和1的个数相等,我们更新结果res,
map的初始化要注意
代码如下:
Example 1:
Input: [0,1]
Output: 2
Explanation: [0, 1] is the longest contiguous subarray with equal number of 0 and 1.
Example 2:
Input: [0,1,0]
Output: 2
Explanation: [0, 1] (or [1, 0]) is a longest contiguous subarray with equal number of 0 and 1.
Note: The length of the given binary array will not exceed 50,000.
这道题给了我们一个二进制的数组,让我们找邻近的子数组使其0和1的个数相等。对于求子数组的问题,我们需要时刻记着求累积和是一种很犀利的工具,但是这里怎么将子数组的和跟0和1的个数之间产生联系呢?我们需要用到一个trick,遇到1就加1,遇到0,就减1,这样如果某个子数组和为0,就说明0和1的个数相等,这个想法真是太叼了,不过博主木有想出来。知道了这一点,我们用一个哈希表建立子数组之和跟结尾位置的坐标之间的映射。如果某个子数组之和在哈希表里存在了,说明当前子数组减去哈希表中存的那个子数字,得到的结果是中间一段子数组之和,必然为0,说明0和1的个数相等,我们更新结果res,
map的初始化要注意
代码如下:
#include <iostream> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <string> #include <climits> #include <algorithm> #include <sstream> #include <functional> #include <bitset> #include <numeric> #include <cmath> using namespace std; class Solution { public: int findMaxLength(vector<int>& nums) { int res = 0, n = nums.size(), sum = 0; map<int, int> mmp{ { 0, -1 } }; for (int i = 0; i < n; ++i) { sum += (nums[i] == 1) ? 1 : -1; if (mmp.find(sum)!=mmp.end()) res = max(res, i - mmp[sum]); else mmp[sum] = i; } return res; } };
相关文章推荐
- Leetcode 453. Minimum Moves to Equal Array Elements 使数组相等 解题报告
- Leetcode 462. Minimum Moves to Equal Array Elements II 使数组相等 解题报告
- LeetCode 330. Patching Array(数组补丁)
- [LeetCode]26. Search in Rotated Array II旋转数组查找II
- LeetCode-Search in Rotated Sorted Array-旋转数组中的搜索-二分搜索+代数逻辑
- leetcode Find All Numbers Disappeared in an Array 找数组中消失的元素
- LeetCode Rotate Array(数组的旋转)
- [LeetCode] 167. Two Sum II - Input array is sorted 两数和 II - 输入是有序的数组
- leetcode array数组刷题easy组:561:Array Partition I
- ※ Leetcode - Array - 88. Merge Sorted Array(快速归并两个有序数组)
- leetcode 数组array之566. Reshape the Matrix
- LeetCode 26 Remove Duplicates from Sorted Array(从已排序数组中移除重复元素)
- LeetCode 153. Find Minimum in Rotated Sorted Array (在旋转有序数组中找到最小值)
- [LeetCode] Split Array with Equal Sum 分割数组成和相同的子数组
- LeetCode 108. Convert Sorted Array to Binary Search Tree (有序数组转化为二叉搜索树)
- LeetCode108_Convert SortedArray to BinarySearchTree(将有序数组转成二叉排序树) Java题解
- [Leetcode,python] Find All Numbers Disappeared in an Array 寻找数组中消失的数字
- Search in Rotated Sorted Array II 旋转数组(有重复元素)里找数@LeetCode
- (Java) LeetCode 453. Minimum Moves to Equal Array Elements —— 最小移动次数使数组元素相等
- LeetCode-Find Minimum in Rotated Sorted Array(找出反转数组中的最小值)