NC321. 连续数组的长度
描述
示例1
输入:
[0,1]
输出:
2
说明:
数组中0,1的个数相同且子数组最长为原数组示例2
输入:
[0,0,1,0,0,0,1,1]
输出:
6
说明:
从第3个数到第8个数构成的子数组中0,1的个数相同且该子数组最长C 解法, 执行用时: 13ms, 内存消耗: 2308KB, 提交时间: 2022-06-25
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param numsLen int nums数组长度 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 */ int max(int a, int b) { return a > b ? a : b; } int findMaxLength(int* nums, int numsLen ) { int preSum[numsLen + 1]; int lastIndexArray[200001] = { 0 }; int maxLen = 0; preSum[0] = 0; for (int i = 0; i < numsLen; i++) { if (nums[i] == 0) { nums[i] = -1; } preSum[i+1] = preSum[i] + nums[i]; lastIndexArray[preSum[i+1]+100000] = i+1; } for (int i = 0; i < numsLen; i++) { if (preSum[i+1] == 0) { maxLen = max(maxLen, i+1); } if (lastIndexArray[preSum[i+1]+100000] > i) { maxLen = max(maxLen, lastIndexArray[preSum[i+1]+100000] - i - 1); } } return maxLen; }
C++ 解法, 执行用时: 21ms, 内存消耗: 5124KB, 提交时间: 2022-08-06
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int findMaxLength(vector<int>& nums) { // write code here int len=nums.size(); for(int i=0;i<len;i++) { if(nums[i]==0) nums[i]=-1; } unordered_map<int,int> hash; int prev=0; hash[0]=-1; int ans=0; for(int i=0;i<len;i++) { prev+=nums[i]; if(hash.find(prev)!=hash.end()) { ans=max(ans,i-hash[prev]); } if(hash.find(prev)==hash.end()) hash[prev]=i; } return ans; } };
C++ 解法, 执行用时: 21ms, 内存消耗: 5128KB, 提交时间: 2022-03-14
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int findMaxLength(vector<int>& nums) { // write code here int len=nums.size(); for(int i=0;i<len;i++){ if(nums[i]==0) nums[i]=-1; } unordered_map<int, int> hash; int prev=0; hash[0]=-1; int ans=0; for(int i=0;i<len;i++){ prev+=nums[i]; if(hash.find(prev)!=hash.end()){ ans=max(ans,i-hash[prev]); } if(hash.find(prev)==hash.end()) hash[prev]=i; } return ans; } };
C++ 解法, 执行用时: 21ms, 内存消耗: 5140KB, 提交时间: 2022-06-21
class Solution { public: int findMaxLength(vector<int>& nums) { int h = nums.size(); for (int i = 0; i < h; i++) { if (nums[i] == 0) nums[i] = -1; } unordered_map<int, int> a; int f = 0; a[0] = -1; int z = 0; for (int i = 0; i < h; i++) { f += nums[i]; if (a.find(f) != a.end()) { z = max(z, i - a[f]); } if (a.find(f) == a.end()) a[f] = i; } return z; } };
C++ 解法, 执行用时: 21ms, 内存消耗: 5496KB, 提交时间: 2022-05-11
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int findMaxLength(vector<int>& nums) { // write code here int len=nums.size(); vector<int> temp(len,0); unordered_map<int, int> mp; temp[0]=(nums[0]==0?1:-1); for(int i=1;i<len;i++) { if(nums[i]==1) temp[i]=temp[i-1]-1; else temp[i]=temp[i-1]+1; } int res=0; for(int i=0;i<len;i++) { if(temp[i]==0) res=max(res,i+1); else { if(mp.find(temp[i])==mp.end()) mp[temp[i]]=i; else res=max(res,i-mp[temp[i]]); } } return res; } };