日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划)

發布時間:2024/7/23 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 & 代碼
      • 變式題:返回答案數組
      • 更新

可惡。。居然碰到了周一面試沒撕出最優復雜度的題

題目描述

  • 難點在于時間復雜度O(n),否則來個sort()還是很輕松的

思路 & 代碼

  • 一般來說,時間復雜度可以用空間復雜度來彌補:來選個數據結構吧!
  • 顯而易見,哈希表!K - V :數組元素 - 以該元素為端點的序列的最長值
  • 狀態轉移方程:now = left + right + 1
  • 最優子結構:left & right
  • put(i ,now) 只是為了 containsKey() 判斷,狀態轉移還得看端點。
class Solution {public int longestConsecutive(int[] nums) { int ans = 0;// 元素 - 連續值Map<Integer, Integer> hashmap = new HashMap<>();for(int i : nums){// 新值存入情況if(!hashmap.containsKey(i)){// 左邊、右邊的所處端點值int left = hashmap.get(i - 1) != null ? hashmap.get(i - 1) : 0;int right = hashmap.get(i + 1) != null ? hashmap.get(i + 1) : 0;int now = left + right + 1;ans = Math.max(now, ans);// 只存端點即可,具體原因可自己手寫流程hashmap.put(i - left, now);hashmap.put(i + right, now);// 1. 為 containsKey 服務 2. 可能當前點就是端點hashmap.put(i, now);}}return ans;} } // 變式(返回答案數組):維護一個index,隨著ans更新而更新 index = i - left,最后按照 index & ans 創造新數組即可

變式題:返回答案數組

  • 維護一個index,隨著ans更新而更新 index = i - left,最后按照 index & ans 創造新數組即可

更新

  • 經典空間換時間!注意 temp 也要 put 進去,因為 containsKey 要用!
class Solution {public int longestConsecutive(int[] nums) {int ans = 0;Map<Integer, Integer> hashmap = new HashMap<>();for(int temp : nums) {if(!hashmap.containsKey(temp)) {int left = hashmap.get(temp - 1) == null ? 0 : hashmap.get(temp - 1);int right = hashmap.get(temp + 1) == null ? 0 : hashmap.get(temp + 1);int now = left + right + 1;ans = Math.max(now, ans);hashmap.put(temp - left, now);hashmap.put(temp + right, now);hashmap.put(temp, now);}}return ans;} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。