求最大連續陣列
阿新 • • 發佈:2018-12-11
題目描述:給定一個二進位制陣列,找到含有相同數量的0和1的最長連續子陣列
(1)方法一,暴力破解法,獲取字串的子串,n^2個,然後判斷每個串是否符合0,1個數相同,這樣做的時間複雜度為O(n^3)
稍微優化,如果一個長度為n的子串滿足條件,那麼這n個元素的和加起來一定=(n/2);這樣的話,迴圈增量加就可以了,不用每個子串從頭計算,複雜度降為O(N^2)
(2)將所有的數字0替換為-1,定義一個變數sum=0;然後讓這個變數與陣列中的每個元素逐個相加,用map記錄每次相加的結果記錄及其下標,如果在後面得到某個結果是在map中已經存在的值,那麼證明sum在a~b這個範圍內相加的結果為0,也就是這個範圍中0與1的數量相同,然後通過下標相減得到這個範圍長度。接下來我們不斷更新這種範圍長度的最大值便可。
int findMaxLength(vector<int>& nums) { int res = 0 , sum = 0,n = nums.size(); for(int i = 0;i<n;i++) if(nums[i] == 0) nums[i] = -1; //把所有為0的數字替換成-1 unordered_map<int,int> mp; mp[0] = -1; //存一個0在map裡面,下標為-1 for(int i = 0;i<n;i++) { sum+=nums[i]; //sum與陣列中每個元素相加 if(mp.count(sum)) //有重複的出現 { int t = i-mp[sum]; //得到兩個重複數字之間的距離長度 res = max(res,t); //更新最大值 } else //新增沒有過的數字 mp[sum] = i; } return res; }