【LeetCode】升級打怪之路 Day 02:有序數組平方 滑動窗口法

今日題目:

  • 977. 有序數組的平方 | LeetCode
  • 209. 長度最小的子數組 | LeetCode
  • 76. 最小覆蓋子串 | LeetCode
  • 59. 螺旋矩陣 II | LeetCode

目錄

    • 今日總結
    • Problem 1:有序數組平方 ???
    • Problem 2:滑動窗口法 【必會】
      • LeetCode 209. 長度最小的子數組 Medium
      • LeetCode 76. 最小覆蓋子串 Hard
    • Problem 3:螺旋矩陣 II 【還行】

今日總結

今天繼續做的《數組》系列的題目,其中最重要的是學習滑動窗口法,學會了滑動窗口的代碼框架思路,并借助兩道題目來學習利用這個框架代碼來解決具體問題,這是重點要掌握的。

除此之外,還解決了另外兩道題,其中“有序數組平方”這道題鍛煉了我對雙指針法的靈活運行,學習到了在使用雙指針時,選擇一個好的行進方向可以避免對很多臨界情況的判斷,從而減少代碼復雜度避免出錯

Problem 1:有序數組平方 ???

977. 有序數組的平方 | LeetCode

這個題考驗對“雙指針”的靈活運用,不能死板。

最開始的做法是先找到第一個非負整數和最大負數,然后從中間向兩邊逐個比較得出結果,但這樣的缺點是需要判斷大量的臨界條件,這很容易就產生錯誤,所以應該換一個思路。

在這里需要轉換一個思路,不要從中間向兩邊走,而是從兩邊向中間走,從而利用雙指針。這樣在 while 中判斷終止條件就只需要是 left 和 right 有沒有碰上了。

這個題目最簡單的方法就是,讓 left 指向 0,right 指向末尾,然后兩個指針逐漸向中間移動,每次將最大的放到結果集中:

class Solution {public int[] sortedSquares(int[] nums) {List<Integer> result = new ArrayList<>();int left = 0, right = nums.length - 1;while (!(left > right)) {  // 直到 left 和 right 碰上int leftValue = nums[left] * nums[left];int rightValue = nums[right] * nums[right];if (leftValue < rightValue) {result.add(rightValue);right--;} else {result.add(leftValue);left++;}}Collections.reverse(result);return result.stream().mapToInt(Integer::valueOf).toArray();}
}

因為這里是每次讓平方值大的移動,當 left 或 right 走到中間絕對值是最小值的數字后就不會再移動了,所以不用擔心 left 會超過負數范圍或者 right 超過正數范圍。我的一次 commit 就因為擔心這個而多寫了很多判斷條件。

總結的經驗是,利用好題目的特性和性質,選擇好雙指針的移動方向,盡量減少對臨界條件的判斷,從而減小代碼復雜度

Problem 2:滑動窗口法 【必會】

這個方法是個通用的方法,用于解決子串問題

參考 labuladong 的講解,滑動窗口的代碼框架如下:

int left = 0, right = 0;while (left < right && right < s.size()) {// 增大窗口window.add(s[right]);right++;// 更新相關數據 ......while (window needs shrink) {// 縮小窗口(在這之前可能需要記錄一下解)window.remove(s[left]);left++;// 更新相關數據 ......}
}

具體的講解可以參考 labuladong 的文章。這里使用這個思路來解決 LeetCode 中 209 和 76 兩個題目。重要是通過這幾個題目來理解如何利用上面這個滑動窗口框架來解決具體的問題

LeetCode 209. 長度最小的子數組 Medium

209. 長度最小的子數組 | LeetCode

這個題可以經典地套用上面的框架,解題代碼如下:

class Solution {public int minSubArrayLen(int target, int[] nums) {int low = 0, high = 0;int sum = 0;int minLen = nums.length;int curLen = 0;boolean found = false;while (high < nums.length) {// 擴大右窗口sum += nums[high];high++;// 更新相關數據curLen++;while (sum >= target) {// 記錄解found = true;if (curLen < minLen) {minLen = curLen;}// 收縮左窗口sum -= nums[low];low++;// 更新相關數據curLen--;}}return found? minLen: 0;}
}

LeetCode 76. 最小覆蓋子串 Hard

這個題雖然很難,但仍然能夠套用上面介紹的滑動窗口框架,需要額外處理的就是一些條件的檢查等問題。

通過這個題,可以很好地鍛煉如何套用之前滑動窗口框架代碼

關于這個題的講解,可以參考 labuladong 文章中的講解。

Problem 3:螺旋矩陣 II 【還行】

59. 螺旋矩陣 II | LeetCode

這個題目還行,比較偏技巧,抓住問題的要點:“方向的改變是固定的,也就是向右走的下一個方向一定是向下走”,所以我們需要確定好什么時候發生方向的轉變。

這個題目在 LeetCode 中題解所介紹的有點麻煩,這里我的關鍵實現是實現一個 next() 函數,這個函數根據當前的方向和位置,確定出下一個走到的位置。確定下一個位置的思路是:判斷一下當前方向能不能繼續向下走,不能走的話就轉變方向。

代碼實現:

class Solution {int row;  // 當前位置的行號int col;  // 當前位置的列號int direction;  // 當前移動的方向public int[][] generateMatrix(int n) {row = 0;col = 0;direction = 1;int[][] matrix = new int[n][n];int square = n * n;for (int i = 1; i <= square; i++) {matrix[row][col] = i;if (i != square) {next(matrix, n);}}return matrix;}// 根據當前的方向和位置,確定下一個移動到的位置private boolean next(int[][] matrix, int n) {if (direction == 1) {  // 向右走if (col + 1 < n && matrix[row][col + 1] == 0) {  // 判斷是否能繼續按這個方向走col += 1;return true;} else {  // 不能繼續的話,就轉變方向direction = 2;return next(matrix, n);}}if (direction == 2) {  // 向下走if (row + 1 < n && matrix[row + 1][col] == 0) {row += 1;return true;} else {direction = 3;return next(matrix, n);}}if (direction == 3) {  // 向左走if (col - 1 >= 0 && matrix[row][col - 1] == 0) {col -= 1;return true;} else {direction = 4;return next(matrix, n);}}if (direction == 4) {  // 向上走if (row - 1 >= 0 && matrix[row - 1][col] == 0) {row -= 1;return true;} else {direction = 1;return next(matrix, n);}}return false;}}
  • 關鍵就是這里的 next() 函數的實現

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

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

相關文章

怎樣提取WPS文檔的目錄?

怎樣提取WPS文檔的目錄&#xff08;智能識別目錄&#xff09;&#xff1f; 1. 將你的WPS文檔打開&#xff0c;菜單&#xff1a;文件&#xff1a;輸出為PDF&#xff0c;另存為(.pdf) 2. PyPDF2 從PDF文件中提取目錄 運行 python pdf_read_dir.py 你的PDF文件 或者 java : pd…

【2024軟件測試面試必會技能】Appium自動化(5):元素定位工具

常用元素定位工具使用 uiautomatorviewer定位工具&#xff1a; 元素定位主要用來獲取元素信息&#xff0c;獲取元素信息后才能用appium提供的相關API去識別和操作元素。 谷歌在AndroidSDK中&#xff0c;提供了元素定位工具uiautomatorviewer&#xff0c;該工具可在android-s…

系統學習Python——裝飾器:類裝飾器-[跟蹤對象接口:基礎知識]

分類目錄&#xff1a;《系統學習Python》總目錄 文章《系統學習Python——裝飾器&#xff1a;類裝飾器-[單例類&#xff1a;基礎知識]》的單例示例闡明了如何使用類裝飾器來管理一個類的所有實例。類裝飾器的另一個常用場景是為每個生成的實例擴展接口。類裝飾器基本上可以在實…

三opencv源碼解壓及環境變量配置

1.雙擊opencv-3.4.6-vc14-vc15.exe 2.選擇解壓的路徑&#xff0c;點擊【extract】 3.設計環境變量

從零學習Linux操作系統第二十七部分 shell腳本中的變量

一、什么是變量 變量的定義 定義本身 變量就是內存一片區域的地址 變量存在的意義 命令無法操作一直變化的目標 用一串固定的字符來表示不固定的目標可以解決此問題 二、變量的類型及命名規范 環境級別 export A1 在環境關閉后變量失效 退出后 關閉 用戶級別&#xff…

《初階數據結構》尾聲

目錄 前言&#xff1a; 《快速排序&#xff08;非遞歸&#xff09;》: 《歸并排序》&#xff1a; 《歸并排序&#xff08;非遞歸&#xff09;》&#xff1a; 《計數排序》&#xff1a; 對于快速排序的優化&#xff1a; 分析&#xff1a; 總結&#xff1a; 前言&#xff1a…

新疆營盤古城及古墓群安防艙體實施方案

3 總體布局 3.1設計原則 3.1.1執行有效的國家標準、國家軍用標準和行業標準&#xff1b; 3.1.2滿足指標要求&#xff1b; 3.1.3采用通用化、模塊化設計&#xff0c;提高設備可維修性&#xff1b; 3.1.4采用人機工程學知識進行設計&#xff0c;充分考慮安全性。 3.2 總體…

Double-DQN算法

Double-DQN算法的原理簡介、與DQN對比等。 參考深度Q網絡進階技巧 1. 原理簡介 在DQN算法中&#xff0c;雖然有target_net和eval_net&#xff0c;但還是容易出現Q值高估的情況&#xff0c;原因在于訓練時用通過target_net選取最優動作 a ? argmax ? a Q ( s t 1 , a ; w…

51單片機學習(3)-----獨立按鍵控制LED的亮滅狀態

前言&#xff1a;感謝您的關注哦&#xff0c;我會持續更新編程相關知識&#xff0c;愿您在這里有所收獲。如果有任何問題&#xff0c;歡迎溝通交流&#xff01;期待與您在學習編程的道路上共同進步了。 目錄 一. 器件介紹及實驗原理 1.獨立按鍵 &#xff08;1&#xff09;獨…

react 實現路由攔截

簡單介紹下項目背景&#xff0c;我這里做了一個demo&#xff0c;前端使用mock數據&#xff0c;然后實現簡單的路由攔截&#xff0c;校驗session是否包含用戶作為已登錄的依據&#xff0c;react-router-dom是v6。不像vue可以設置登錄攔截beforeenter&#xff0c;react需要我們自…

外包干了3個月,技術退步明顯

先說一下自己的情況&#xff0c;本科生&#xff0c;19年通過校招進入廣州某軟件公司&#xff0c;干了接近4年的功能測試&#xff0c;今年年初&#xff0c;感覺自己不能夠在這樣下去了&#xff0c;長時間呆在一個舒適的環境會讓一個人墮落!而我已經在一個企業干了四年的功能測試…

Linux之用戶和用戶組的深入了解

目錄 一、簡介 1.1、用戶&#xff1a; 1.2、用戶組 1.3、UID和GID 1.3、用戶賬戶分類 查看用戶類別 超級用戶root(0) 程序用戶(1~499) 普通用戶(500~65535) 二、用戶 2.1、添加新的用戶賬號&#xff1a;useradd 2.2、刪除賬號&#xff1a;userdel 有-r與沒有-r區別…

OSDI 2023: Hyrax Fail-in-Place Server Operation in Cloud Platforms

我們使用以下6個分類標準對本文的研究選題進行分析: 1. 硬件故障類型 DRAM: 此類別涉及研究如何處理內存相關的錯誤。這包括單比特錯誤,使用傳統 ECC 進行校正,以及需要冗余、修復技術或隔離故障內存區域的更廣泛的故障。磁盤: 此處研究將解決存儲故障,尤其是 SSD 中的故障…

運維07:堡壘機

什么是跳板機 跳板機就是一臺服務器而已&#xff0c;運維人員在使用管理服務器的時候&#xff0c;必須先連接上跳板機&#xff0c;然后才能去操控內網中的服務器&#xff0c;才能登錄到目標設備上進行維護和操作 開發小張 ---> 登錄跳板機 ---> 再登錄開發服務器 測試…

貸齊樂系統最新版SQL注入(無需登錄繞過WAF可union select跨表查詢)

一、環境 已上傳資源&#xff08;daiqile&#xff09; 二、代碼解釋 1.1Request 不管get請求還是post請求都可以接收到 1.2過濾的還挺多 1.3第二個WAF把數據分為兩個了一個Key一個value&#xff0c;全是explode的功勞 1.4submit是if進入的前提 很明顯走進來了 1.5那我們在這…

學習JAVA的第三天(基礎)

目錄 流程控制語句 順序結構 分支結構 循環結構 分類&#xff1a; 練習 跳轉控制語句 練習 數組 數組介紹 數組的定義和靜態初始化 數組定義 數組的靜態初始化 數組元素訪問 數組遍歷 數組動態初始化 JAVA內存分配 流程控制語句 順序結構 是Java程序默認的執行流程…

UIKit 在 UICollectionView 中拖放交換 Cell 視圖的極簡實現

概覽 UIKit 中的 UICollectionView 視圖是我們顯示多列集合數據的不二選擇&#xff0c;而豐富多彩的交互操作更是我們選擇 UICollectionView 視圖的另一個重要原因。 如上圖所示&#xff1a;我們實現了在 UICollectionView 中拖放交換任意兩個 Cell 子視圖的功能&#xff0c;這…

js如何判斷一個對象中某一個屬性存在并且有值

在JavaScript中&#xff0c;可以使用不同的方法來判斷一個對象中某個屬性是否存在并且有值。以下是幾種常見的方法&#xff1a; 1、使用hasOwnProperty()方法&#xff1a;該方法用于檢查對象是否具有指定的屬性。可以通過以下方式來判斷屬性是否存在并且有值&#xff1a; if (…

整理了去年的一些運維面試題一

Ingress的yaml文件需要包含哪些&#xff1f; CICD搭建流程&#xff1f; JAVA程序打包工具&#xff1f; 如何檢測Linux端口如何通信&#xff1f; k8s集群之間如何通信的&#xff1f; docker組成部分&#xff1f; 20位掩碼有多少主機IP&#xff1f; 在linux中四個T的硬盤使用什…

Zabbix 遠程監控主機

目錄 1、安裝 Zabbix 安裝客戶端 服務端測試通訊 Web頁面添加主機 2、監控 Nginx 自定義腳本監控 Nginx web配置臺 3、監控 MySQL 配置模版文件 配置Web界面 1、安裝 Zabbix node-12 作為zabbix的被監控端&#xff0c;提供mysql服務器&#xff0c;配置zabbix監控node…