題目連接數組
題目大意:給出一個數組,找出其中連續數值最多的長度。例子以下:ide
法一:o(nlgn)。先排序,而後遍歷一遍,查找連續數值,一旦不連續,則更新ma。代碼以下(耗時1ms):spa
1 public int longestConsecutive(int[] nums) { 2 if(nums.length == 0) { 3 return 0; 4 } 5 //排序 6 Arrays.sort(nums); 7 int cnt = 1, ma = 1; 8 //逐一遍歷 9 for(int i = 1; i < nums.length; i++) { 10 //去除重複值 11 if(nums[i] == nums[i - 1]) { 12 continue; 13 } 14 //若是連續 15 else if(nums[i] == nums[i - 1] + 1) { 16 cnt++; 17 } 18 //一旦不連續,更新ma和cnt 19 else { 20 if(cnt > ma) { 21 ma = cnt; 22 } 23 cnt = 1; 24 } 25 } 26 //因爲可能整個數組一直連續,因此最後還應該再判斷一下 27 if(cnt > ma) { 28 ma = cnt; 29 } 30 return ma; 31 }
法二:o(n)。利用hashmap,鍵值對是<nums[i],總連續個數>。具體代碼以下(耗時18ms):3d
1 public int longestConsecutive(int[] nums) { 2 HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 3 int res = 0; 4 for(int i = 0; i < nums.length; i++) { 5 //若是已經存在,則繼續遍歷 6 if(map.containsKey(nums[i])) { 7 continue; 8 } 9 //找到當前值左連續的數值個數 10 int left = map.containsKey(nums[i] - 1) ? map.get(nums[i] - 1) : 0; 11 //找到當前值右連續的數值個數 12 int right = map.containsKey(nums[i] + 1) ? map.get(nums[i] + 1) : 0; 13 //計算當前值總連續的數值個數 14 int sum = left + right + 1; 15 //更新到map中 16 map.put(nums[i], sum); 17 //找最大值 18 res = Math.max(res, sum); 19 //這個是重點!!!更新左連續和右連續的數值個數,可是爲啥不就近更新呢?好比說nums[i]-1,而要更新那麼遠的? 20 map.put(nums[i] - left, sum); 21 map.put(nums[i] + right, sum); 22 } 23 return res; 24 }