1. 程式人生 > >一個一維維陣列中只有1和-1,實現程式,求和為0的最長子串長度,並在註釋中給出時間和空間複雜度

一個一維維陣列中只有1和-1,實現程式,求和為0的最長子串長度,並在註釋中給出時間和空間複雜度

這是一個比動態規劃更簡單的解法。

思路就是在i從0到n,計算sum(i),sum(i)表示從0到i的元素之和。並儲存在字典dic中,value是索引i,在往後的遍歷中每得到一個sum(i)就檢視dic的keys是否已有此sum(i)值,如果有則用當前i位置減去儲存的i,並與maxLen比較,取大的那個。遍歷結束,給出結果。時間複雜度O(n),空間複雜度O(1)。

原連結裡是用python寫的,我又用Java寫了一下

我把hash裡的key和value與思路里的變了一下位置。所以要先判斷hashMap.get(sum)有沒有值。有值就比較,沒值就存值。

sum是指從0到i的和,i是第幾個數。注意一下最開始的sum是0,所以一開始要hashMap.put(0,-1);-1是比第0個數更早的初始sum。

import java.util.HashMap;

public class yuantiku {
    public static int getLongestLength(int []a) {
        int max=0;
        int sum=0;
        HashMap<Integer,Integer> hashMap=new HashMap<>();
        hashMap.put(0,-1);
        for (int i=0;i<a.length;i++){
            sum=sum+a[i];
            if (hashMap.get(sum)==null){
                hashMap.put(sum,i);
            }else{
                int tmp=i-hashMap.get(sum);
                if (max<tmp){
                    max=tmp;
                }
            }
        }
        return max;

    }

    public static void main(String[] args) {
        int []a=new int[]{ -1, -1,-1, -1, -1, 1, 1, 1};
        System.out.println(getLongestLength(a));
    }
}

下面是簡書原文

前幾天猿題庫的筆試題,想了挺久不知道咋做,中午問了慧偉,剛給出了答案。一直以為用動態規劃,其實不然。

題目是這樣的:一個一維陣列中只有1和-1,實現程式,求和為0的最長子串長度,並在註釋中給出時間和空間複雜度。

思路就是在i從0到n,計算sum(i),sum(i)表示從0到i的元素之和。並儲存在字典dic中,value是索引i,在往後的遍歷中每得到一個sum(i)就檢視dic的keys是否已有此sum(i)值,如果有則用當前i位置減去儲存的i,並與maxLen比較,取大的那個。遍歷結束,給出結果。時間複雜度O(n),空間複雜度O(1)。

Python程式碼:

# coidng:utf-8
# @sinner
# 16/9/8

class Solution(object):
    def fun(self, l):
        dic = {0:-1}
        sum = 0
        maxLen = 0
        for x in xrange(0, len(l)):
            sum += l[x]
            if sum in dic: maxLen = max(maxLen, x - dic[sum])
            else: dic[sum] = x
        return maxLen


print Solution().fun([1, -1, -1, -1, 1, 1, 1, -1, -1])

輸出為8.



作者:貳拾貳畫生
連結:https://www.jianshu.com/p/3bf87384a92b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。