Leetcode刷題2

文章目錄

  • 前言
  • 尋找兩個正序數組的中位數
    • 1?? 雙指針快速排序
    • 2?? 第k小數解法
  • Z 字形變換
    • 1?? 個人解法
    • 2??巧妙解法1
    • 3??巧妙解法2
  • 字符串轉換整數 (atoi)
    • 1?? 常規方法
    • 2?? 作弊方法😫
  • 整數轉羅馬數字
    • 1?? 常規方法:按照給定規則寫出判斷條件即可
    • 2?? 循環實現
  • 羅馬數字轉整數
    • 1?? 常規處理
    • 2?? 改進
  • 總結


前言

????算法小白初入leetcode。本文主要記錄個人在leetcode上使用python解題的思路和過程,如果有更好、更巧妙的解題方法,歡迎大家在評論區給出代碼或思路。🚀
在這里插入圖片描述


尋找兩個正序數組的中位數

  • 題目描述

在這里插入圖片描述

  • 實際上就是對數組排序的問題

1?? 雙指針快速排序

  • 定義兩個指針 i i i j j j,初始時分別指向兩個列表的開頭。然后,比較指針所指的元素,將較小的元素添加到結果列表中,并將對應指針向后移動一位。重復這個過程,直到其中一個列表的所有元素都被添加到結果列表中。最后,將另一個列表中剩余的元素添加到結果列表的末尾。具體代碼和執行過程可以如下所示:
class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:num_12 = []i   = 0j   = 0while i<len(nums1) and j <len(nums2):if    nums1[i] < nums2[j]:num_12.append(nums1[i]) i += 1elif  nums1[i] > nums2[j]:num_12.append(nums2[j])j += 1else:   # 如果兩個指針指向的數值相同,重復添加該元素,同時移動兩個指針num_12 += [nums1[i],nums2[j]]i += 1j += 1# 若其中一個數組遍歷完成了,則將另外一個數組中的剩余元素添加到num_12中 while i<len(nums1):num_12.append(nums1[i])i += 1while j<len(nums2):num_12.append(nums2[j])j += 1if len(num_12)%2 == 0:return (num_12[len(num_12)//2] + num_12[len(num_12)//2 - 1]) / 2else :return num_12[len(num_12)//2]

在這里插入圖片描述在這里插入圖片描述

2?? 第k小數解法

  • 這個解法是眾多題解中非常巧妙的一個,具體原理和算法可以直接看這里:第k小數解法視頻詳解
  • 算法實現:知道原理后,其實本質就是在不斷排除比中位數還要小的那些數,直到找到中位數,所以可以利用遞歸的方式去實現它。
class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:total_length = len(nums1) + len(nums2)if total_length % 2 == 1:# 如果總長度為奇數,則中位數為第 (total_length // 2 + 1) 小的元素return self.findKthElement(nums1, nums2, total_length // 2 + 1)else:# 如果總長度為偶數,則中位數為第 total_length // 2 和第 total_length // 2 + 1 小的元素的平均值left = self.findKthElement(nums1, nums2, total_length // 2)right = self.findKthElement(nums1, nums2, total_length // 2 + 1)return (left + right) / 2def findKthElement(self,nums1, nums2, k):"""nums1: 第一個有序數組nums2: 第二個有序數組k    : 要查找的第 k 小的元素(1-indexed)返回值: 第 k 小的元素"""len1, len2 = len(nums1), len(nums2)# 確保 nums1 是較短的數組if len1 > len2:return self.findKthElement(nums2, nums1, k)# 如果較短數組為空,則直接返回 nums2 中的第 k 個元素if len1 == 0:return nums2[k-1]# 如果 k == 1,則返回兩個數組中第一個元素的最小值if k == 1:return min(nums1[0], nums2[0])# 選擇 nums1 和 nums2 中的 k//2 個元素,比較這兩個元素i = min(len1, k // 2)j = min(len2, k // 2)if nums1[i-1] > nums2[j-1]:# 如果 nums1 中第 i 個元素較大,則說明 nums2 中的前 j 個元素不可能是第 k 小的元素return self.findKthElement(nums1, nums2[j:], k - j)else:# 如果 nums2 中第 j 個元素較大,則說明 nums1 中的前 i 個元素不可能是第 k 小的元素return self.findKthElement(nums1[i:], nums2, k - i)

在這里插入圖片描述確實是又快了一些,可惜才擊敗三十多,想知道更快的解法💡

Z 字形變換

  • 題目描述

在這里插入圖片描述

1?? 個人解法

  • 可以發現每一行的字符都與第一行的字符存在關聯的,所以只要先確定第一行的元素,后面幾行的元素就能確定了。如題目描述中的示例2,第二行字符ALSIG可以認為是第一行字符PIN中每個元素在 s s s中的索引位置向左和右各移動 1 1 1次得到(超出索引位置就舍棄掉),第二行字符YAHR可以認為是第一行字符PIN中每個元素在 s s s中的索引位置向左和右各移動 2 2 2次得到(超出索引位置就舍棄掉),依次類推…
    但是要注意兩點:1):最后一行的字符按照這樣的處理會導致出現重復,所以需要單獨處理;2):如果是下面這種情況,按照這樣的處理就會導致末尾RI這兩個字符遺漏,所以由第一行字符中最后一個字符確定其他行字符時,需要單獨處理。

在這里插入圖片描述

class Solution:def convert(self, s: str, numRows: int) -> str:'''思路:先確定第一行和最后一行的元素,后面幾行的元素順序與第一行有關'''if numRows == 1:return sline1       = ''line1_index = []length      = len(s)for i in range(0,length,2*(numRows-1)):line1 += s[i]line1_index.append(i)for i in range(numRows-1):next_line = ''index = []for j in line1_index:if i == numRows-2:    #最后一行作特殊處理if j+numRows-1 < length:next_line += s[j+numRows-1]else:if j-i-1 > 0:next_line += s[j-i-1]if j+i+1 < length:next_line += s[j+i+1]if j == line1_index[-1] and j+2*numRows-3-i < length:next_line += s[j+2*numRows-3-i]line1 += next_linereturn line1

在這里插入圖片描述
不過時間效率并不高,有待優化🤦?♂?

2??巧妙解法1

  • 參考leetcode-wuji3

在這里插入圖片描述


class Solution:def convert(self, s: str, numRows: int) -> str:temp = [i for i in range(numRows)]temp += temp[1:-1][::-1]res = [''] * numRowsn = len(s)for i in range(n):res[temp[i%len(temp)]] += s[i]return ''.join(res)

在這里插入圖片描述
思路清晰,代碼簡潔,確實很巧妙!

3??巧妙解法2

  • 使用變量 i i i 表示當前字符的行索引,初始值為 0 0 0;使用變量 f l a g flag flag 表示行索引的變化方向,初始值為 ? 1 -1 ?1。然后遍歷原字符串中的每個字符 c c c:將當前字符 c c c 添加到 r e s [ i ] res[i] res[i] 對應的行中。如果當前行索引 i 到達首行或末行,則改變 f l a g flag flag 的方向。最后根據 f l a g flag flag 的方向更新行索引 i i i,這樣一來就實現了“Z”字形的邏輯。
class Solution:def convert(self, s: str, numRows: int) -> str:if numRows < 2:return sres = ['' for i in range(numRows)]i , flag = 0,-1for c in s:res[i] += cif i == 0 or i == numRows - 1:flag = -flagi = i + flagreturn ''.join(res)

在這里插入圖片描述

字符串轉換整數 (atoi)

  • 題目描述:

在這里插入圖片描述

1?? 常規方法

  • 按照題目,思路如下:
    • 第一步去掉字符串前面的所有空格;
    • 分類討論,只保留符合條件的字符:
      • 首字符是-或者+的情況:從第二個字符遍歷到最后一個字符,滿足條件的字符留下。對于是否保留 0 0 0這個字符,可以通過最終拼接的字符串re的長度來判斷,如果等于 0 0 0說明是前置零,直接舍棄,其余情況則保留。對于非數字字符的判斷,可以通過 A s c a l l Ascall Ascall碼來進行判斷。
      • 其他情況:同上處理,只不過從開頭遍歷到結尾。
    • 將最后拼接的字符串轉換成整數并輸出。
class Solution:def myAtoi(self, s: str) -> int:s = s.strip()re  = ''if s == '':return 0elif s[0] == '-' or s[0] == '+':i = 1while i <= len(s)-1:if ord(s[i]) < 48 or ord(s[i]) > 57:breakif len(re) == 0  and s[i] == 0:continueelse:re += s[i]i += 1if len(re) == 0:return 0elif s[0] == '-':return max(-int(re),-2**31)else:return min(int(re),2**31-1)else:i = 0while i <= len(s)-1:if ord(s[i]) < 48 or ord(s[i]) > 57:breakif len(re) == 0  and s[i] == 0:continueelse:re += s[i]i += 1if len(re) == 0:return 0else:return min(int(re) , 2**31-1)

在這里插入圖片描述

2?? 作弊方法😫

  • 其實Python中的內置函數int可以直接實現這個題目的大部分情況,我們直接拿來使用,然后對于使用不了的情況就用try ... except進行捕捉,然后再使用上面的常規方法。
class Solution:def myAtoi(self, s: str) -> int:try:return max(int(s),-2**31) if '-' in s else min(int(s),2**31-1) except Exception as e:s = s.strip()re  = ''if s == '':return 0elif s[0] == '-' or s[0] == '+':i = 1while i <= len(s)-1:if ord(s[i]) < 48 or ord(s[i]) > 57:breakif len(re) == 0  and s[i] == 0:continueelse:re += s[i]i += 1if len(re) == 0:return 0elif s[0] == '-':return max(-int(re),-2**31)else:return min(int(re),2**31-1)else:i = 0while i <= len(s)-1:if ord(s[i]) < 48 or ord(s[i]) > 57:breakif len(re) == 0  and s[i] == 0:continueelse:re += s[i]i += 1if len(re) == 0:return 0else:return min(int(re) , 2**31-1)            

在這里插入圖片描述確實提速了一些hhh

整數轉羅馬數字

  • 題目描述

在這里插入圖片描述

1?? 常規方法:按照給定規則寫出判斷條件即可

class Solution:def intToRoman(self, num: int) -> str:char_num = {1:'I',5:'V',10:'X',50:'L',100:'C',500:'D',1000:'M',4:'IV',9:'IX',40:'XL',90:'XC',400:'CD',900:'CM'}re = ''while num > 0:if 1000 <= num:re += char_num[1000]num -= 1000elif 900 <= num < 1000:re += char_num[900]num -= 900elif 500 <= num < 900:re += char_num[500]num -= 500  elif 400 <= num < 500:re += char_num[400] num -= 400elif 100 <= num < 400:re += char_num[100]num -= 100elif 90 <= num < 100:re += char_num[90]num -= 90elif 50 <= num < 90:re += char_num[50]num -= 50elif 40 <= num < 50:re += char_num[40]num -= 40elif 10 <= num < 40:re += char_num[10]num -= 10elif 9 <= num < 10:re += char_num[9]num -= 9elif 5 <= num < 9:re += char_num[5]num -= 5elif 4 <= num < 5:re += char_num[4]num -= 4elif 1 <= num < 4:re += char_num[1]num -= 1return re

在這里插入圖片描述

2?? 循環實現

  • 將上面判斷改成循環的方式實現
class Solution:def intToRoman(self, num: int) -> str:char_num = {1000:'M', 900:'CM', 500:'D', 400:'CD', 100:'C', 90:'XC', 50:'L', 40:'XL', 10:'X', 9:'IX', 5:'V', 4:'IV', 1:'I'}re = ''for i in char_num.keys():if num // i != 0:re += char_num[i] * (num//i)num = num % i return re

在這里插入圖片描述
不過速度變慢了一些

羅馬數字轉整數

  • 題目描述(上面一題的相反處理)

在這里插入圖片描述

1?? 常規處理

  • 先將字符串中特殊的 6 6 6種羅馬數字挑選出來轉換成整數,然后再將剩下的羅馬單個字符一一轉換成數字即可。
class Solution:def romanToInt(self, s: str) -> int:dict1 = {'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000}dict2 = {'IV': 4,'IX': 9,'XL': 40,'XC': 90,'CD': 400,'CM': 900}result = 0for i in dict2.keys():if i in s:result += dict2[i]s       = s.replace(i,'')for i in s:result += dict1[i]return result

在這里插入圖片描述

2?? 改進

  • 上面算法需要遍歷兩次字符串,時間復雜度為 O ( 2 n ) \mathcal{O(2n)} O(2n),其實只需要遍歷一次就行,時間復雜度變成 O ( n ) \mathcal{O(n)} O(n)
class Solution:def romanToInt(self, s: str) -> int:dict1 = {'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000}dict2 = {'IV': 4,'IX': 9,'XL': 40,'XC': 90,'CD': 400,'CM': 900}result = 0while len(s) >= 1:if len(s) == 1:result += dict1[s[0]]s = ''elif dict1[s[0]] < dict1[s[1]]:result += dict2[s[0:2]]s = s[2:]else:result += dict1[s[0]]s = s[1:]return result   

在這里插入圖片描述

總結

算法小白初入leetcode,期待給出更精妙的算法🚀🚀🚀

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

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

相關文章

前端面試題日常練-day32 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末。 1. 在jQuery中&#xff0c;以下哪個選項用于獲取元素的文本內容&#xff1f; a) text() b) html() c) val() d) attr() 2. jQuery中&#xff0c;以下哪個選項用于在元素上添加一個自定義數據屬性…

感動心靈的聲音——帶情緒的AI配音技術在影視和廣告領域的應用

近年來&#xff0c;隨著人工智能技術的飛速發展&#xff0c;帶情緒的AI配音技術作為其中一項重要應用&#xff0c;正逐漸在影視和廣告行業展現其獨特的魅力和應用價值。傳統的配音工作不僅需要具備優秀的嗓音和表演能力&#xff0c;還要求配音演員能夠準確捕捉并表達角色的情感…

WSL調用docker

WSL&#xff08;windows subsystem linux&#xff09;是window系統的原生linux子系統&#xff0c;用于代碼開發很方便。 希望在wsl里面運行docker&#xff0c;首先要安裝docker在WSL中使用&#xff0c;大部分人的第一想法肯定是用以下命令行安裝&#xff08;個人不推薦&#x…

java的unsafe

在Java中&#xff0c;sun.misc.Unsafe 是一個強大且危險的類&#xff0c;它提供了一些直接操作內存、對象和線程的底層功能。這個類通常不鼓勵普通開發者使用&#xff0c;因為它繞過了Java語言的一些安全性和內存管理機制&#xff0c;可能會導致難以追蹤的錯誤和安全漏洞。 Un…

前端生成二維碼

直接img標簽顯示 npm i use_qrcode npm包地址 <img :src"qrcode" alt"QR Code" /> const txt: any ref(https://baidu.com) const qrcode useQRCode(txt) const qrcodeLogo useQRCode(txt, { logoSrc: https://www.antdv.com/assets/logo.1ef800…

2.go環境配置與開發工具選擇

go 環境配置 下載安裝包 官網(https://go.dev/dl/) 下載地址(國內)(https://golang.google.cn/dl/) 根據自己的操作系統選擇下載即可 下載后安裝 記住地址 比如&#xff1a; D:\work\devtool\go 配置系統環境變量 PATH 指向 go 的安裝 bin 目錄 比如&#xff1a; D:\work…

若依前端vue實現 輸入框下拉選擇加搜索用戶

探索代碼以及詳細的注解 <template><div><el-select v-model"selectedUserId" filterable placeholder"選擇用戶" change"handleChange"><el-optionv-for"user in filteredUsers":key"user.userId":l…

集合框框框地架

這一次來介紹一下常用的集合&#xff1a; 首先是兩種集合的《家庭系譜圖》&#xff1a; 接下來介紹一下集合的種類&#xff1a; Collection Set SetTreeSet&#xff1a;基于紅?樹實現&#xff0c;?持有序性操作&#xff0c;例如&#xff1a;根據?個范圍查找元素的操作。但…

如何使用純原生的ADO.NET技術進行數據讀取

目錄 1. 引用命名空間 2. 創建連接字符串 3. 打開數據庫連接 4. 執行SQL查詢 5. 讀取結果集 6. 處理異常和關閉連接 1. 引用命名空間 在代碼文件中引用幾個關鍵的System.Data.SqlClient命名空間&#xff0c;這些命名空間包含了用于數據庫操作的類。 using System.Data.Sq…

Unity實現TableView

基于Scrollview封裝的TableView&#xff0c;實現對視野外的Cell回收利用&#xff0c;減少創建Cell的開銷。 核心邏輯如下&#xff1a; /***************************************動態使用cell核心邏輯開始 **************************************///計算所有cell的坐標信息 …

利用java8 的 CompletableFuture 優化 Flink 程序,性能提升 50%

你好&#xff0c;我是 shengjk1&#xff0c;多年大廠經驗&#xff0c;努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注&#xff01;你會有如下收益&#xff1a; 了解大廠經驗擁有和大廠相匹配的技術等 希望看什么&#xff0c;評論或者私信告訴我&#xff01; 文章目錄 一…

flume sink 簡介及官方用例

1、HDFS Sink 此sink將事件寫入 Hadoop 分布式文件系統 &#xff08;HDFS&#xff09; 中。它目前支持創建文本和序列文件。它支持兩種文件類型的壓縮。可以根據經過的時間或數據大小或事件數定期滾動文件&#xff08;關閉當前文件并創建一個新文件&#xff09;。它還按事件起…

AI圖書推薦:用100個ChatGPT提示詞掌握Python編程

《用100個ChatGPT提示詞掌握Python編程》&#xff08;ChatGPT:Your Python Coach Mastering the Essentials in 100 Prompts&#xff09; 塞爾吉奧羅哈斯-加萊亞諾&#xff08;Sergio Rojas-Galeano&#xff09;是一位熱情的計算機科學家&#xff0c;對人工智能、機器學習、進化…

C++中獲取int最大與最小值(補)

上文中&#xff0c;我們學習了C中獲取int最大與最小值的兩種方法&#xff1a;C庫和移位運算&#xff0c;這篇文章將解決在移位運算中遇到的各種報錯&#xff0c;并提出一種新的生成int最值的方法 上文鏈接&#xff1a;http://t.csdnimg.cn/cn7Ad 移位運算取最值常見報錯 Dev…

匯編語言(STC89C52)

指令是計算機計算CPU根據人的意圖來執行某種操作的命令。一臺計算機所執行的全部指令的集合&#xff0c;稱為這個CPU的指令系統。而想要使計算機按照人們的要求完成一項工作&#xff0c;就必須讓CPU按順序執行預設的操作&#xff0c;即逐條執行人們編寫的指令。這種按照人民要求…

C++ 寫的_string類,兼容std::string, MFC CString和 C# 的string

代碼例子&#xff1a; using namespace lf; int main() { CString s1 _t("http://www.csdn.net"); _string s2 s1; CString s3 s2; _pcn(s1); _pcn(s2); _pcn(s3); return 0; } 輸出&#xff1a; _Str.h /***************************************…

網創教程:WordPress插件網創自動采集并發布

網創教程&#xff1a;WordPress插件網創自動采集并發布 使用插件注意事項&#xff1a; 如果遇到404錯誤&#xff0c;請先檢查并調整網站的偽靜態設置&#xff0c;這是最常見的問題。需要定制化服務&#xff0c;請隨時聯系我。 本次更新內容 我們進行了多項更新和優化&#x…

深入解析kube-scheduler的算法自定義插件

目錄 ?編輯 一、問題引入 二、自定義步驟 三、最佳實踐考慮 一、問題引入 當涉及到 Kubernetes 集群的調度和資源分配時&#xff0c;kube-scheduler 是一個關鍵組件。kube-scheduler 負責根據集群的調度策略&#xff0c;將 Pod 分配到適當的節點上。kube-scheduler 默認使…

python爬蟲學習代碼1

百度翻譯&#xff1a;利用爬蟲技術模擬人工查詢英文單詞&#xff0c;將查到的信息保存到本地 import requests import json # 1.指定url post_url https://fanyi.baidu.com/sug # 2.UA標識 headers {"User-Agent": Mozilla/5.0 (Windows NT 10.0; Win64; x64) Appl…

pyqt6入門案例

效果預覽 hello.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Dialog</class><widget class"QDialog" name"Dialog"><property name"geometry"><…