1. 程式人生 > >Leetcode 525.連續數組

Leetcode 525.連續數組

相同 tin ava fin map() hashmap code port hash

連續數組

給定一個二進制數組, 找到含有相同數量的 0 和 1 的最長連續子數組。

示例 1:

輸入: [0,1]

輸出: 2

說明: [0, 1] 是具有相同數量0和1的最長連續子數組。

示例 2:

輸入: [0,1,0]

輸出: 2

說明: [0, 1] (或 [1, 0]) 是具有相同數量0和1的最長連續子數組。

註意: 給定的二進制數組的長度不會超過50000。

題解:

首先對原數組做處理,將所有的0都變為-1;這樣一來 "含有相同數量的 0 和 1 的連續數組" 就等價為 "元素值總和為0的連續數組"。

其後,從頭掃一遍數組,並記錄當前的前綴和的值,將該值和對應的下標存入到一個標記數組或哈希表中。若該前綴和的值已出現過(即標記數組或哈希中已存在),則說明標記中的下標到當前掃描的下標的這段數組的總和值是為0的。

打個例子: [ -1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1 ] 在掃描完到第四個元素時,前綴和為-2 且未記錄過,則將值-2和下標3記錄起來。當掃描到 [ -1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1 ] , 此時得到的前綴和為-2,且知道標記中有記錄過-2,則說明此刻下標到之前記錄的下標的這段數組總和為0 [ -1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1 ] 。

 1 import java.util.HashMap;
 2 
 3 class Solution {
 4     public int findMaxLength(int
[] nums) { 5 int ans = 0,sum = 0; 6 for(int i=0;i<nums.length;i++)if(nums[i]==0)nums[i]=-1; 7 HashMap<Integer,Integer> map = new HashMap(); 8 for(int i=0;i<nums.length;i++) { 9 sum+=nums[i]; 10 if(sum == 0) { if(i >= ans) ans = i+1; }
11 if(map.get(sum) == null) { map.put(sum,i); continue; } 12 int temp = i - map.get(sum); 13 if(temp > ans) ans=temp; 14 } 15 return ans; 16 } 17 }

Leetcode 525.連續數組