128.Longest Consecutive Sequence

題目連接數組

題目大意:給出一個數組,找出其中連續數值最多的長度。例子以下: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     }
View Code

 法二: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     }
View Code
相關文章
相關標籤/搜索