1. 程式人生 > >求最大連續陣列

求最大連續陣列

題目描述:給定一個二進位制陣列,找到含有相同數量的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;
    }