LeetCode 熱題 HOT 100(P1~P10)

🔥 LeetCode 熱題 HOT 100

這里記錄下刷題過程中的心得,其實算法題基本就是個套路問題,很多時候你不知道套路或者模板,第一次嘗試去做的時候就會非常懵逼、沮喪和無助。而且就算你一時理解并掌握了,過一段時間往往會絕望的發現你又不會了。所以過遍數就非常重要,我目前配合 anki? 來復習。

?LC001two_sum 兩數之和(簡單)

. - 力扣(LeetCode)

題目:

給定一個整數數組?nums?和一個整數目標值?target,請你在該數組中找出?和為目標值?target? 的那?兩個?整數,并返回它們的數組下標。

解法:

使用HashMap 是比較常規的解法,這里有個技巧是只通過一遍循環就能解決問題。從頭開始遍歷,然后順便把元素放入HashMap,這樣就不用先遍歷一遍初始化HashMap。

public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> cache = new HashMap<>();for (int i = 0; i < nums.length; i++) {int value = target - nums[i];if (cache.containsKey(value)) {return new int[]{ i, cache.get(value) };}cache.put(nums[i], i);}return null;}

LC002add_two_numbers 兩數相加(中等)

題目:

給你兩個 非空 的鏈表,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的,并且每個節點只能存儲 一位 數字。

請你將兩個數相加,并以相同形式返回一個表示和的鏈表。

你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

解法:

鏈表題通常的操作是先增加一個前置pre 節點,這樣就能大大方便后續的操作。因為最后你要返回頭節點,這個時候pre.next 就是。

這道題核心難點是對進位的處理,因此需要有一個變量表示每次的進位,同時在最后還要對進位進行判斷,這點特別容易遺漏。剩下的就是一些細節的處理,有一些為null 的情況需要處理,這點也非常容易踩坑。

 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode pre = new ListNode(0);ListNode cur = pre;//表示進位int carry = 0;while (l1 != null || l2 != null) {int left = l1 == null ? 0 : l1.val;int right = l2 == null ? 0 : l2.val;int sum = left + right + carry;carry = sum / 10;sum = sum % 10;cur.next = new ListNode(sum);cur = cur.next;l1 = l1 == null ? null : l1.next;l2 = l2 == null ? null : l2.next;}if (carry == 1) {cur.next = new ListNode(carry);}return pre.next;}

LC003longest_substring 無重復字符的最長子串 (中等)

. - 力扣(LeetCode)

題目:

給定一個字符串 s ,請你找出其中不含有重復字符的 最長子串的長度

解法:

典型的滑動窗口策略,窗口的左右下標剛開始都是0,首先需要一個緩存用于存放已經遍歷過的字符。右下標開始遍歷,并跟緩存中的字符比較,存在就說明遇到重復的了,這個時候左右下標構成的字符串就是非重復的字符串,然后當前元素進緩存,左下標往前。這里需要注意要設置一個起始點,在每次判斷更新最大長度的時候需要記錄下這個起始點下標,不然最后輸出的時候沒辦法定位。

public int lengthOfLongestSubstring(String s) {Map<Character, Integer> cache = new HashMap<>();int left = 0, max = 0;for (int i = 0; i < s.length(); i++) {final char key = s.charAt(i);if (cache.containsKey(key)) {// 這里+1 說明遇到重復字母,left 標往前挪動了一位left = Math.max(left, cache.get(key) + 1);}cache.put(key, i);max = Math.max(max, i - left + 1);}return max;}

這里有個優化性能的小技巧,因為字符由由英文字母、數字、符號和空格組成,因此可以用asc2 表示,這樣可以用int[128] 代替HashMap。

LC004median_of_two?尋找兩個正序數組的中位數 (困難)

. - 力扣(LeetCode)

題目:

給定兩個大小分別為 m 和 n 的正序(從小到大)數組 nums1 和 nums2。請你找出并返回這兩個正序數組的 中位數 。

算法的時間復雜度應該為 O(log (m+n)) 。

解法:

難點在于復雜度要求為log,這個典型折半查找的思路了。

根據中位數的定義,當 m+n是奇數時,中位數是兩個有序數組中的第 (m+n)/2 個元素,當 m+n 是偶數時,中位數是兩個有序數組中的第 (m+n)/2 個元素和第 (m+n)/2+1 個元素的平均值。因此,這道題可以轉化成尋找兩個有序數組中的第 k 小的數,其中 k 為 (m+n)/2 或 (m+n)/2+1。

剩下的問題就是怎么在兩個數組中找第k個數,并且還要是log 的復雜度。這里直接給結論,先比較兩個數組中k/2 位置的2個數,小的那一個所在數組前k/2 就可以舍棄了,同樣的思路接著找剩下的k/2,當然這里有很多細節和邊界需要考慮。

public double findMedianSortedArrays(int[] nums1, int[] nums2) {int length1 = nums1.length, length2 = nums2.length;int totalLength = length1 + length2;//個數為奇數的情況if (totalLength % 2 == 1) {int midIndex = totalLength / 2;double median = getKthElement(nums1, nums2, midIndex + 1);return median;} else {//個數偶數的情況int midIndex1 = totalLength / 2 - 1, midIndex2 = totalLength / 2;double median =(getKthElement(nums1, nums2, midIndex1 + 1) + getKthElement(nums1, nums2, midIndex2 + 1)) / 2.0;return median;}}/*** 注意這里的k是第k位,并不是下標k** @param nums1* @param nums2* @param k* @return*/public int getKthElement(int[] nums1, int[] nums2, int k) {/* 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 進行比較* 這里的 "/" 表示整除* nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共計 k/2-1 個* nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共計 k/2-1 個* 取 pivot = min(pivot1, pivot2),兩個數組中小于等于 pivot 的元素共計不會超過 (k/2-1) + (k/2-1) <= k-2 個* 這樣 pivot 本身最大也只能是第 k-1 小的元素* 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把這些元素全部 "刪除",剩下的作為新的 nums1 數組* 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把這些元素全部 "刪除",剩下的作為新的 nums2 數組* 由于我們 "刪除" 了一些元素(這些元素都比第 k 小的元素要小),因此需要修改 k 的值,減去刪除的數的個數*/int length1 = nums1.length, length2 = nums2.length;int index1 = 0, index2 = 0;while (true) {// 邊界情況if (index1 == length1) {return nums2[index2 + k - 1];}if (index2 == length2) {return nums1[index1 + k - 1];}if (k == 1) {return Math.min(nums1[index1], nums2[index2]);}// 正常情況int half = k / 2;int newIndex1 = Math.min(index1 + half, length1) - 1;int newIndex2 = Math.min(index2 + half, length2) - 1;int pivot1 = nums1[newIndex1], pivot2 = nums2[newIndex2];if (pivot1 <= pivot2) {k -= (newIndex1 - index1 + 1);index1 = newIndex1 + 1;} else {k -= (newIndex2 - index2 + 1);index2 = newIndex2 + 1;}}}

getKthElement 可以用遞歸的方法改寫下,這樣能精簡不少。

LC005longest_palindromic?最長回文子串 (中等)

. - 力扣(LeetCode)

題目:

給你一個字符串 s,找到 s 中最長的回文子串。如果字符串的反序與原始字符串相同,則該字符串稱為回文字符串。

解法:

這里用了動態規劃,動態規劃的難點在于動態方程的推導,動態方程很多時候又取決于動態數組的定義,只能說多接觸不同類型的題目來增長這方面的經驗。

針對這道題定義了boolean 類型的2維數組,dp[i][j] 表示s[i][j]是否為回文。

然后就是2層循環不斷推進的過程。

public String longestPalindrome(String s) {final int len = s.length();if (len < 2) {return s;}int begin = 0, max = 1;//dp[i][j] 表示s[i][j]是否為回文boolean[][] dp = new boolean[len][len];final char[] charArray = s.toCharArray();for (int j = 0; j < len; j++) {for (int i = 0; i <= j; i++) {if (charArray[j] == charArray[i]) {//只有3個的時候,只要兩邊相等就是回文if (j - i < 3) {dp[i][j] = true;} else {//大于3個的時候就要看進一步的情況dp[i][j] = dp[i + 1][j - 1];}}//如果是回文就看下是否當前最大if (dp[i][j] && j - i + 1 > max) {begin = i;max = j - i + 1;}}}return s.substring(begin, begin + max);}
理解了核心思想之后,其實就是一些套路了。

LC011container_with?盛最多水的容器 (中等)

. - 力扣(LeetCode)

題目:

給定一個長度為 n 的整數數組 height 。有 n 條垂線,第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。返回容器可以儲存的最大水量。

解法:

套路題,用雙指針左右夾逼法求解。一開始左右指針在兩邊頭尾,這個時候寬度是最大的,高是兩邊最矮的那個,然后進一步從矮的那邊往中間靠近。

public int maxArea(int[] height) {int left = 0, right = height.length - 1;int max = 0;while (left < right) {int high = Math.min(height[left], height[right]);int wide = right - left;max = Math.max(max, high * wide);if (height[left] < height[right]) {left++;} else {right--;}}return max;}

未完待續

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715691.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715691.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715691.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蘋果 Vision Pro零售部件成本價格分析

蘋果公司發布的全新頭戴式顯示器 Apple Vision Pro 雖然售價高達3499美元&#xff0c;但其制造成本同樣不菲&#xff0c;根據研究機構 Omdia 的估計&#xff0c;該頭顯僅零部件成本就超過了1500美元。這款頭顯的總零部件成本估計為1542美元&#xff0c;這還并不包括研發、包裝、…

騰訊云服務器CVM_云主機_云計算服務器_彈性云服務器

騰訊云服務器CVM提供安全可靠的彈性計算服務&#xff0c;騰訊云明星級云服務器&#xff0c;彈性計算實時擴展或縮減計算資源&#xff0c;支持包年包月、按量計費和競價實例計費模式&#xff0c;CVM提供多種CPU、內存、硬盤和帶寬可以靈活調整的實例規格&#xff0c;提供9個9的數…

【算法】順時針打印矩陣(圖文詳解,代碼詳細注釋

目錄 題目 代碼如下: 題目 輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字。例如:如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則打印出數字:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 這一道題乍一看,沒有包含任何復雜的數據結構和…

Doris實戰——美聯物業數倉

目錄 一、背景 1.1 企業背景 1.2 面臨的問題 二、早期架構 三、新數倉架構 3.1 技術選型 3.2 運行架構 3.2.1 數據模型 縱向分域 橫向分層 數據同步策略 3.2.2 數據同步策略 增量策略 全量策略 四、應用實踐 4.1 業務模型 4.2 具體應用 五、實踐經驗 5.1 數據…

代碼隨想錄算法訓練營|day45

第九章 動態規劃 322.零錢兌換279.完全平方數代碼隨想錄文章詳解總結 322.零錢兌換 dp[i]表示湊成i所需的最少零錢個數 (1)先遍歷物品&#xff0c;后遍歷背包 func coinChange(coins []int, amount int) int {maxAmount : amount 1dp : make([]int, amount1)for i : 0; i &l…

下載github項目到pycharm

一、下載git 1.下載git鏈接 https://git-scm.com/ 2.一路點擊next&#xff0c;最后finish 二、使用git 1.安裝成功后在開始菜單欄會找到如下內容&#xff0c;其中常用的是Git Bash 2.點擊Git Bash 3.這里就可以克隆github上的代碼了 點擊復制&#xff0c;在命令行輸入…

C#判斷DataTable1 A列的集合是否為DataTable2 B列的集合的子集

DataSet ds2 (DataSet)res2.Anything; // 檢查 集合B是否為集合A的子集 var table1MaterialCodes ds.Tables[2].AsEnumerable().Select(row > row["Code"]).ToList(); //DataSet1 表Code列集合A var table2MaterialCodes ds2.Tables[0].AsEnumerable().Selec…

2024免費mac蘋果電腦的清理和維護軟件CleanMyMac X

對于 Mac 用戶來說&#xff0c;電腦的清理和維護是一件讓人頭疼的事情。但是&#xff0c;有了 CleanMyMac X&#xff0c;這一切都將變得輕松愉快。CleanMyMac X 是一款專為 Mac 設計的電腦清理軟件&#xff0c;它以其強大的功能和簡單的操作&#xff0c;讓無數用戶為之傾倒。 C…

艾爾登法環備份存檔方法

1.PC端使用WinR輸入%AppData%\EldenRing 2.如圖創建文件夾“我這取名叫備份存檔”&#xff0c;將其中的三個文件復制到新建的文件夾中 3.理論上只需要備份替換ER0000.sl2文件即可

【雙指針】合并兩個有序數組O(N)

合并兩個有序數組 鏈接 . - 力扣&#xff08;LeetCode&#xff09;. - 備戰技術面試&#xff1f;力扣提供海量技術面試資源&#xff0c;幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/merge-sorted-array/ 題目 題解 采用雙指針…

青少年CTF擂臺挑戰賽 2024 #Round 1 Web方向題解 WP 全

EasyMD5 題目描述&#xff1a;php沒有難題 考點總結&#xff1a;腦洞題目&#xff0c;不如我出&#xff08;狗頭 只允許兩個都上傳pdf文件。 文件還不能太大了。burp多次發包發現要求兩個pdf內容不一樣 不一樣時候&#xff0c;提示我們MD5碰撞。 科學計數法繞過 PHP的后門 …

把Anaconda添加進環境變量的方法(解決pip識別不到環境的問題)

找到你的Anaconda的安裝根目錄 比如我的是在&#xff1a;C:\ProgramData\Anaconda3 那么只需要將以下目錄添加進環境變量即可&#xff1a; C:\ProgramData\Anaconda3C:\ProgramData\Anaconda3\ScriptsC:\ProgramData\Anaconda3\Library\binC:\ProgramData\Anaconda3\condabin…

吳恩達deeplearning.ai:通過偏差與方差進行診斷

以下內容有任何不理解可以翻看我之前的博客哦&#xff1a;吳恩達deeplearning.ai專欄 文章目錄 偏差與方差高偏差高方差合適的模型理解偏差與方差 總結 當你構建神經網絡的時候&#xff0c;幾乎沒有人能夠在一開始就將神經系統構建得十分完美。因此構建神經網絡最重要的是直到…

Vue2實現tab切換

Vue2實現tab切換 以下代碼實現了一個tab切換的功能&#xff0c;點擊不同的tab會切換到對應的內容&#xff0c;并且選中的tab文字帶下劃線&#xff0c;下劃線寬度比文字寬度短&#xff0c;并且與文字居中。 <template><div><div class"tabs"><…

慣性傳感器的傾角計算

慣性傳感器單元 IMU IMU 是 Inertial Measurement Unit 的縮寫, 直接翻譯過來就是慣性測量單元, 常見的有單獨的三軸加速度(Accelerometer)計 ADXL345, L3G4200D, L3GD20等, 單獨的三軸角速度計(又稱陀螺儀, Gyroscope) LIS3DH, L3GD20H, BMG160, 以及包含了加速度計和陀螺儀的…

Qt 簡約又簡單的加載動畫 第七季 音量柱風格

今天和大家分享兩個音量柱風格的加載動畫,這次的加載動畫的最大特點就是簡單,只有幾行代碼. 效果如下: 一共三個文件,可以直接編譯運行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc…

尋找峰值[中等]

優質博文IT-BLOG-CN 一、題目 峰值元素是指其值嚴格大于左右相鄰值的元素。給你一個整數數組nums&#xff0c;找到峰值元素并返回其索引。數組可能包含多個峰值&#xff0c;在這種情況下&#xff0c;返回 任何一個峰值 所在位置即可。 你可以假設nums[-1] nums[n] -∞。 你…

python統計分析——泊松回歸

參考資料&#xff1a;用python動手學統計學 概率分布為泊松分布、聯系函數為對數函數的廣義線性模型叫作泊松回歸。解釋變量可以有多個&#xff0c;連續型和分類型的解釋變量也可以同時存在。 1、案例說明 分析不同氣溫與啤酒銷量的關系。構造不同氣溫下的銷量的數學模型&…

Java之美[從菜鳥到高手演變]之Json類型數據的處理

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易于人閱讀和編寫。同時也易于機器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON采用完全獨立于語言的文本格式&#xff0c;但是也使…

Unity--自動版面(Horizontal Layout Croup)||Unity--自動版面(Vertical Layout Group)

Unity--自動版面&#xff08;Horizontal Layout Croup&#xff09; Horizontal Layout Croup&#xff1a; “水平布局組”組件將其子布局元素并排放置。它們的寬度由各自的最小&#xff0c;首選和靈活的寬度決定&#xff0c;具體取決于以下模型&#xff1a; 所有子布局元素的…