LeetCode刷題——hot 100(3)

題目1:矩陣置零

題目:

問題分析:使用兩個布爾數組來分別記錄哪行哪列出現了0,當出現0的行和列,對應的布爾數組值置為true。再次遍歷數組,當出現行數組和列數組中的值為true,則對應的原數組的值置為0.

代碼:

class Solution {public void setZeroes(int[][] matrix) {int m=matrix.length;//記錄數組的行數int n=matrix[0].length;//記錄數組的列數boolean[] row=new boolean[m];boolean[] col=new boolean[n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j]==0){row[i]=col[j]=true;}}}for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(row[i]||col[j]) matrix[i][j]=0;}}}
}

時間復雜度:O(mn).

題目2:螺旋矩陣

題目:

問題分析:用數組記錄四個方向,用「行偏移量,列偏移量」描述 4 個方向,directions的四個元素分別表示右 下 左 上四個方向,用directionIndex來訪問方向數組中的四個方向,是directions數組的索引,當遇到已訪問的數組元素或是邊界的時候,就更改訪問的方向為下一個方向。

代碼:

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result=new ArrayList<>();int rows=matrix.length;//總共的行數int columns=matrix[0].length;//總共的列數boolean[][] visited=new boolean[rows][columns];if(matrix==null||rows==0||columns==0){return result;}int row=0;//當前行int column=0;//當前列int[][] directions={{0,1},{1,0},{0,-1},{-1,0}};//分別表示右 下 左 上四個方向int directionIndex=0;//當前的方向索引,對上上面的數組directions的四個方向for(int i=0;i<rows*columns;i++){result.add(matrix[row][column]);visited[row][column]=true;int nextRow=row+directions[directionIndex][0];int nextColumn=column+directions[directionIndex][1];if(nextRow<0||nextRow>=rows||nextColumn<0||nextColumn>=columns||visited[nextRow][nextColumn]){directionIndex=(directionIndex+1)%4;//越界或是遇到已訪問的元素,方向換一個}row=row+directions[directionIndex][0];column=column+directions[directionIndex][1];}return result;}
}

時間復雜度:O(N).

題目3:旋轉圖像

題目:

問題分析:使用翻轉操作代替旋轉操作,先將數組以水平軸翻轉,再將數組根據對角線翻轉。水平翻轉只翻轉上半部分,所以i<n/2,對角線翻轉只翻轉一半的對角線,所以j<i.

代碼:

class Solution {public void rotate(int[][] matrix) {int n=matrix.length;for(int i=0;i<n/2;i++){//只翻轉上半部分for(int j=0;j<n;j++){int temp=matrix[i][j];matrix[i][j]=matrix[n-i-1][j];//水平翻轉,行變列不變matrix[n-i-1][j]=temp;}}for(int i=0;i<n;i++){for(int j=0;j<i;j++){int temp=matrix[i][j];matrix[i][j]=matrix[j][i];//對角線翻轉,行列互換matrix[j][i]=temp;}}}
}

時間復雜度:O(N^2).

題目4:搜索二維矩陣II

題目:


問題分析:從右上角開始查找,若當前元素大于target,則說明當前元素所在列都不可能找到target,因為數組從上到下升序排列,則往前一列繼續查找;若當前元素小于target,則說明當前元素所在行都不可能找到target,因為數組從左到右升序排列,則往下一行繼續查找。

代碼:

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int i=0;int j=matrix[0].length-1;//右上角的數組下標while(i<matrix.length&&j>=0){if(matrix[i][j]==target) return true;//找到則返回trueelse if(matrix[i][j]>target){j--;}else{i++;}}return false;}
}

時間復雜度:O(M+N).

題目5:相交鏈表

題目:

問題分析:

代碼:

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode p=headA;ListNode q=headB;while(p!=q){//p不等于q的時候才循環,p=q則證明要么到相交節點了,要么沒有相交節點,到空節點了p=p!=null?p.next:headB;q=q!=null?q.next:headA;}return p;}
}

代碼比較兩個節點的時候,比較的是內存地址是否一致,兩個鏈表相交,其相交節點的內存地址一定一致。

時間復雜度:O(M+N).

題目6:環形鏈表

題目:

問題分析:使用快慢指針來求解,快慢指針同時從頭結點出發,快指針每次走兩步,慢指針每次走一步,若是兩者相遇,這則證明鏈表中一定存在環。因為快指針相對于慢指針走一步,所以若有環,快指針一定會追上慢指針。

代碼:

public class Solution {public boolean hasCycle(ListNode head) {ListNode fast=head;ListNode slow=head;while(fast!=null&&fast.next!=null){//因為快指針每次走兩步,得同時滿足fast和fast.next都不為null的情況下,才能成功的走完兩步slow=slow.next;fast=fast.next.next;if(slow==fast){return true;}}return false;}
}

時間復雜度:O(N).

題目7:反轉鏈表

題目:

問題分析:使用迭代的頭插法來解決這道題目,例如鏈表1->2->3,使用頭插法,就是把新建一個空鏈表,依次把1,2,3插到這個新鏈表的頭部,就得到鏈表3->2->1,這就是反轉后的鏈表。

代碼:

class Solution {public ListNode reverseList(ListNode head) {if(head==null||head.next==null){return head;}ListNode pre=null;ListNode cur=head;while(cur!=null){ListNode next=cur.next;cur.next=pre;pre=cur;cur=next;//不斷地迭代,直至跳出while循環}return pre;}
}

時間復雜度:O(N).

題目8:回文鏈表

題目:

問題分析:首先找到鏈表的中間節點,若是原鏈表有奇數個節點,則是最中間一個,例如1->2->3,這個鏈表的中間節點是2;若是原鏈表有偶數個節點,則是中間偏右的那個節點,5->3->4->1,這個鏈表的中間節點是4。然后把中間節點之后的鏈表進行反轉,再依次比較反轉后的鏈表的各個節點與原鏈表前半部分節點的值。例如,原鏈表為6->4->5->4->6,中間的節點為5,反轉后的鏈表為head2: 6->4,之前的鏈表head: 6->4->5,比較各個節點的值。

代碼:

class Solution {public boolean isPalindrome(ListNode head) {ListNode mid=middleNode(head);ListNode head2=reverse(mid);while(head2!=null){if(head.val!=head2.val) return false;head=head.next;head2=head2.next;}return true;}private ListNode middleNode(ListNode head){ListNode slow=head;ListNode fast=head;while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;}return slow;}private ListNode reverse(ListNode head){ListNode pre=null;ListNode cur=head;while(cur!=null){ListNode next=cur.next;cur.next=pre;pre=cur;cur=next;}return pre;}
}

時間復雜度:O(N).

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

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

相關文章

Ajax-day2(圖書管理)-渲染列表

本篇筆記素材來自“黑馬程序員” 渲染列表圖書管理一、獲取數據二、渲染數據完整代碼圖書管理 Bootstrap 框架渲染列表&#xff08;查&#xff09;新增圖書&#xff08;增&#xff09;刪除圖書&#xff08;刪&#xff09;編輯圖書&#xff08;改&#xff09; 自己的圖書數據&a…

MOS管的電路

MOS管的三極都會存在以下三個電容&#xff0c;分別是&#xff1a;Cgs,Cgd,Cds 輸入電容CissCgsCgd 輸出電容CossCgdCds 反向傳輸電容CrssCgd&#xff0c;也叫米勒電容 然而&#xff0c;這三個等效電容是構成串并聯組合關系&#xff0c;他們并不是獨立的&#xff0c;而是相互…

STM32_05_時鐘樹

時鐘 d用來輸入數據&#xff0c;CLK就是我們的時鐘&#xff0c;CPU1s中72000000HZ個時鐘周期STM32的時鐘樹鎖相環HSE時鐘源HSI時鐘源LSE時鐘源LSI時鐘源SystemInit函數SetSysClock函數SetSysClockTo72函數SystemInit()后時鐘頻率大小總結RCC標準庫函數定義變量a&…

C語言---判斷語句

文章目錄1. if 語句2. if...else 語句3. if...else if...else 語句4. switch 語句5. 三元運算符 ( ? : )總結與對比如何選擇C語言中的判斷語句用于根據給定的條件來決定執行哪一段代碼。其核心是條件為真&#xff08;必須&#xff09;則執行一段代碼&#xff0c;條件為假&…

[硬件電路-212]:電流的本質確實是電子的移動

1. 微觀機制&#xff1a;電子的定向漂移與熱運動定向漂移&#xff08;Drift Motion&#xff09;&#xff1a;在導體&#xff08;如金屬&#xff09;中&#xff0c;自由電子&#xff08;價電子&#xff09;受電場驅動&#xff0c;從負端向正端定向移動&#xff0c;形成宏觀電流。…

雙RFSOC47DR-16通道5GSPS ADC采集模塊

16通道5GSPS ADC采集板卡組成如圖1所示。該板卡的輸入接口為SMA單端輸入&#xff0c;ADC采集和處理采用Xilinx公司的XCZU47DR-2FFVE1156I芯片。板卡需配備4路QSFP28光口輸出&#xff0c;并需要集成網口、DDR4、SD卡、USB調試口。兩塊RF-Soc需確保連接通信功能。板卡的16通道需實…

pytest -- 中文文檔

前言 零基礎1小時快速入門pytest自動化測試教程&#xff0c;全套項目框架實戰pytest配置文件可以改變pytest的運行方式&#xff0c;它是一個固定的文件pytest.ini文件&#xff0c;讀取配置信息&#xff0c;按指定的方式去運行 非test文件 pytest里面有些文件是非test文件 pyt…

硬件開發2-ARM裸機開發3-IMX6ULL - 引入中斷

一、鋪墊引入中斷 → 按鍵1、概要&#xff1a;實現按鍵控制發光二極管和蜂鳴器輸入類型的外設&#xff1a;按鍵&#xff08;key&#xff09;2、參考手冊內容完成配置過程&#xff08;1&#xff09;key 按鍵原理圖&#xff08;2&#xff09;core 內核中命名 -- UART1 CTS&#x…

Ansible的 Playbook 模式詳解

目錄一、Playbook模式1.1 Playbook 的優勢1.2 Playbook 的組成1.3 安裝 httpd 服務案例1.4 Playbook 命令及常用參數1.5 Playbook 的語法 —— 權限相關1. remote_user2. become3. become_method1.6 Playbook 的通知與觸發機制1. notify2. handlers3. 使用示例4. 使用場景1.6 P…

猿輔導Java后臺開發面試題及參考答案

int 與 Integer 的區別是什么&#xff1f;若創建數量龐大的數字時使用 Integer&#xff0c;會對重復數字創建新對象嗎&#xff1f;int 是 Java 中的基本數據類型&#xff0c;直接存儲數值&#xff0c;占用 4 個字節&#xff0c;默認值為 0&#xff0c;不需要通過 new 關鍵字創建…

代碼隨想錄學習摘抄day9(回溯1-11)

一個樸實無華的目錄定義&#xff1a;回溯法也可以叫做回溯搜索法&#xff0c;它是一種搜索的方式。應用場景&#xff1a;回溯法解決的問題都可以抽象為樹形結構代碼模板題型第77題. 組合思路&#xff1a;每次從集合中選取元素&#xff0c;可選擇的范圍隨著選擇的進行而收縮&…

Altium Designer(AD24)打開工程文件的幾種方法

??《專欄目錄》 目錄 1,概述 2,源文件 2,菜單欄 4,工具欄 5,注意事項 1,概述 本文介紹幾種打開工程文件的方法。 2,源文件 找到工程的源文件存儲路徑,找到.PrjPcb的源工程文件,雙擊打開。 2,菜單欄 第1步:執行File→Open, 第2步:找到工程文件的存儲路徑,并選中…

Linux嵌入式自學筆記(基于野火EBF6ULL):2.點燈與ubuntu安裝

一、點燈登錄root&#xff1a;賬號&#xff1a;root ; 密碼&#xff1a;root點燈命令&#xff1a;echo 0 > /sys/class/leds/red/brightness #關閉red燈 echo 0 > /sys/class/leds/blue/brightness #關閉blue燈 echo 0 > /sys/class/leds/green/brightness …

【Java實戰?】Java實戰:MyBatis-Plus 開啟MySQL數據庫高效操作之旅

目錄 一、MyBatis-Plus 環境集成 1.1 項目依賴引入 1.2 數據庫配置 1.3 代碼生成器使用 二、核心 CRUD 操作實現 2.1 基礎查詢 2.2 數據新增與修改 2.3 復雜查詢場景 三、性能優化與高級特性 3.1 緩存配置 3.2 樂觀鎖實現 3.3 字段自動填充 四、實戰案例:用戶管理模塊開發 4.1…

開學季干貨——知識梳理與經驗分享

技術文章大綱&#xff1a;開學季干貨——知識梳理與經驗分享目標受眾分析明確文章面向的學生群體&#xff08;如大學生、高中生&#xff09; 分析不同群體的核心需求&#xff08;課程準備、時間管理、工具使用&#xff09; 結合技術場景&#xff08;如數字筆記、在線協作&#…

Linux《線程(上)》

通過之前的學習我們已經了解了操作系統當中的基本的概念包括進程、基礎IO、磁盤文件存儲等&#xff0c;但是到目前為止我們還未了解到線程相關的概念&#xff0c;這就使得當前我們對操作系統的認知還不是完整的&#xff0c;現在我們是還是無法理解一個進程當中是如何同時的執行…

為什么知識復用時缺乏場景化指導影響實用性

知識復用時因缺乏場景化指導而嚴重影響實用性&#xff0c;其根本原因在于知識的價值本質上根植于其應用情境。脫離了場景的“純知識”往往是抽象、片面且難以行動的。這導致了認知鴻溝的產生、隱性知識的流失、決策風險的增加、以及學習遷移效率的低下。當使用者面對一份缺乏“…

擁抱直覺與創造力:走進VibeCoding的新世界

引言 在傳統觀念里&#xff0c;編程是一項高度理性、邏輯嚴密的活動&#xff0c;開發者需要像建筑師一樣&#xff0c;用代碼一行行地精確構建數字世界。然而&#xff0c;隨著人工智能技術的飛速發展&#xff0c;一種全新的編程理念和體驗正在興起——它就是 VibeCoding&#xf…

HTTP的Web服務測試在Python中的實現

在Web開發領域&#xff0c;對HTTP Web服務進行測試是確保服務穩定性和可靠性的關鍵步驟。Python作為一種功能強大的編程語言&#xff0c;提供了多種工具和庫來簡化這一過程。本文將介紹如何在Python中實現HTTP的Web服務測試。首先&#xff0c;Python的requests庫是測試HTTP Web…

Android Studio 構建項目時 Gradle 下載失敗的解決方案

一、問題原因分析根據錯誤日志&#xff1a;下載地址 https://services.gradle.org/distributions/gradle-8.1-bin.zip 連接超時&#xff08;10秒&#xff09;。可能原因&#xff1a;網絡環境限制&#xff08;如公司防火墻、地區網絡屏蔽&#xff09;。代理配置未生效或配置錯誤…