一個一維維陣列中只有1和-1,實現程式,求和為0的最長子串長度,並在註釋中給出時間和空間複雜度
阿新 • • 發佈:2019-02-08
這是一個比動態規劃更簡單的解法。
思路就是在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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。