算法(17)-leetcode-劍指offer1

leetcode-劍指offer-1

  • 1.面試題3-數組中的重復數字
  • 2.面試題04-二維數組中的查找
  • 3.面試題05-替換空格
  • 4.面試題06-從尾到頭打印鏈表
  • 5.面試題07-重建二叉樹
  • 6.面試題09-兩個堆棧實現隊列
  • 7.面試題10-1-斐波那契數列
  • 8.面試題10-2-青蛙跳臺階問題
  • 9.面試題11-旋轉數組的最小數字
  • 10.面試題12-矩陣中的路徑

本系列博文為題庫刷題筆記,(僅在督促自己刷題)如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/problemset/lcof/

編程語言為python

1.面試題3-數組中的重復數字

在一個長度為n的數組里,所有的數字都在0-n-1的范圍內,數組中某些數字是重復了的,但是不知道有幾個數字是重復了的,也不知道每個數組的重復次數。請找出數組中任意一個重復的數字:
hash表存儲遍歷過的數字,如果表中已經存在,直接返回。

class Solution(object):def findRepeatNumber(self, nums):""":type nums: List[int]:rtype: int"""vis_has={}for val in nums:if vis_has.get(val):   #訪問字典的鍵值都用這個方法return valelse:vis_has[val]=True

leetcode 287.尋找重復數字
給定一個包含n+1個整數的數組,其中數字都在1-n之間,可知至少存在一個重復數字。假設只存在一個重復整數,找出這個重復的數。
要求:
不能更改原數組(假設數組是只讀的)。
只能使用額外的 O(1) 的空間。–不能用hash表
時間復雜度小于 O(n2) 。–暴力法的時間復雜度是o(n2)
數組中只有一個重復的數字,但它可能不止重復出現一次。
–弗洛伊德兔子烏龜。如果有重復數字,那么就會有至少兩個索引指向相同的數字,這就是鏈表中成環的條件。檢驗鏈表入環節點就是重復的數字。
vi=nums[i],指向下一個索引

class Solution(object):def findDuplicate(self, nums):""":type nums: List[int]:rtype: int"""t=nums[0]r=nums[0]while True:t=nums[t]r=nums[nums[r]]if t==r:breakr=nums[0]while t!=r:t=nums[t]r=nums[r]return t

2.面試題04-二維數組中的查找

在一個nm的二維數組中,每一行都按照從左往右遞增的順序,每一行都按從左到右遞增順序排序,每一列都按照從上到下遞增順序排列,完成在二維數組中查找指定數,在返回true,不在返回false.(與leetcode240一致)
思路1:暴力搜索,忽略有序條件,時間復雜度o(n
m)
思路2:線性查找,從數組的右上角開始搜索:

  • nums[0][n-1]==target: return true
  • nums[0][n-1]<target: 去更大的區域查找,行坐標加1,
  • nums[0][n-1]>taget: 去更小的區域查找,列坐標減1
    直至行列索引不符合條件,時間復雜度o(n+m)
class Solution(object):def findNumberIn2DArray(self, matrix, target):""":type matrix: List[List[int]]:type target: int:rtype: bool"""m=len(matrix)if m==0:return Falsen=len(matrix[0])i,j=0,n-1while(-1<i<m and -1<j<n):if matrix[i][j]==target:return Trueelif matrix[i][j]<target:i+=1else:j-=1return False

3.面試題05-替換空格

請實現一個函數,把字符串中的空格替換成“%20”。
考察的是字符串可變不可變,轉義字符的輸出?
直接想法:新建一個res_str,遍歷原字符串,按要求復制一份。–python操作十分方便

class Solution(object):def replaceSpace(self, s):""":type s: str:rtype: str"""res_str=""for char in s:if char==" ":res_str+="%20"else:res_str+=charreturn res_str

4.面試題06-從尾到頭打印鏈表

輸入一個鏈表的頭節點,從尾到頭反過來返回每個節點的值(用數組返回)。
思路1:先將鏈表反轉,然后打印輸出就可以了。

class Solution(object):def reversePrint(self, head):""":type head: ListNode:rtype: List[int]"""if head==None:return []pre_node=Nonecur_node=headwhile(cur_node):next_node=cur_node.nextcur_node.next=pre_nodepre_node=cur_nodecur_node=next_noderes=[]new_node=pre_nodewhile(new_node):res.append(new_node.val)new_node=new_node.nextreturn res

思路2:將鏈表正序輸出,將結果res逆序輸出就好。

class Solution(object):def reversePrint(self, head):""":type head: ListNode:rtype: List[int]"""if head==None:return []res=[]cur_node=headwhile(cur_node):res.append(cur_node.val)cur_node=cur_node.nextreturn res[::-1]

5.面試題07-重建二叉樹

leetcode 105:從前序與中序遍歷序列構二叉樹

6.面試題09-兩個堆棧實現隊列

用兩個堆棧實現一個隊列。請實現它的兩個函數appendTail和deleteHead,分別完成在隊列尾部插入整數和在隊列頭部刪除整數(若隊列中沒有元素,deleteHead操作返回-1)

堆棧先進后出,隊列先進先出

方案1:
兩個棧
主棧:存隊列。需要添加元素時,將原有的所有元素押入輔助棧,將元素押入棧底,然后將輔助棧的元素押回主棧。刪除元素,直接彈出棧頂元素
輔助棧:輔助主棧實現存元素操作,這個思路主要保證:先存入的元素在棧頂。

class CQueue(object):def __init__(self):self.main_stack=[]self.help_stack=[]def appendTail(self, value):""":type value: int:rtype: None"""if self.main_stack==[]:self.main_stack.append(value)else:while(self.main_stack):self.help_stack.append(self.main_stack.pop())self.main_stack.append(value)while(self.help_stack):self.main_stack.append(self.help_stack.pop())def deleteHead(self):""":rtype: int"""if self.main_stack==[]:return -1return self.main_stack.pop()

4024ms 17.3MB

方案1主要費時在添加一個新元素的時候,需要移動主棧內的所有元素,然后將所有元素押回來,保證最先存入的元素在主棧頂。
改進方案:
插入元素:維護一個主堆棧,每次加元素,往堆棧頂添加元素就可以了
刪除元素:維護一個輔助堆棧,需要彈出元素時將主棧的元素彈入輔助棧,那么第一個入主棧的元素將出現在輔助棧頂,直接將其彈出。重點:此時不需要將剩余元素彈回主棧,因為下一次刪除操作對象還是在輔助棧棧頂。所以彈出操作:檢查輔助棧是否為空,為空將主棧中元素彈入輔助棧中,彈出輔助棧棧頂即可。時間快了3倍數。

class CQueue(object):def __init__(self):self.main_stack=[]self.help_stack=[]def appendTail(self, value):""":type value: int:rtype: None"""self.main_stack.append(value)def deleteHead(self):""":rtype: int"""if self.main_stack==[] and self.help_stack==[]:return -1if self.help_stack==[]:while(self.main_stack):self.help_stack.append(self.main_stack.pop())return self.help_stack.pop()

1816ms 17.4MB

7.面試題10-1-斐波那契數列

寫一個函數,求輸入n的斐波那契數列的第n項。
答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

class Solution(object):def fib(self, n):""":type n: int:rtype: int"""if n==0:return 0if n==1:return 1prepre_f=0pre_f=1f=0for i in range(2,n+1):   f=pre_f+prepre_fprepre_f=pre_fpre_f=freturn f%(10**9+7)

循環求余法用于解決大數越界問題,python可以不用考慮大數越界問題。

8.面試題10-2-青蛙跳臺階問題

一只青蛙一次可以跳一階臺階,也可以跳2階臺階。求該青蛙跳上一個n階臺階總共有多少總跳法。

答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

f(i)表示跳到第i個臺階的方法數,它可以由i-1個臺階跳上來,也可以從i-2個臺階跳上來。所以這兩種方式所擁有的方法數相加就是跳上第i階臺階有的方法數,即f(i)=f(i?1)+f(i?2)f(i)=f(i-1)+f(i-2)f(i)=f(i?1)+f(i?2)。看到這個表達式,不就是斐波那契數列么?再求一次斐波那契數列就好了,唯一的區別就是初始條件prepre_f應該初始化為1,pre_f初始化為1。

class Solution(object):def numWays(self, n):""":type n: int:rtype: int"""if n==0:return 1if n==1:return 1prepre_f=1pre_f=1for i in range(2,n+1):f=pre_f+prepre_fprepre_f=pre_fpre_f=freturn f%(10**9+7)

9.面試題11-旋轉數組的最小數字

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如,數組 [3,4,5,1,2] 為 [1,2,3,4,5] 的一個旋轉,該數組的最小值為1。

思路1:暴力找一個數組最小o(n)

class Solution(object):def minArray(self, numbers):""":type numbers: List[int]:rtype: int"""n=len(numbers)res=float("INF")for val in numbers:res=min(res,val)return res

思路2:二分查找,初始化l=0,r=len(numbers),用中點mid=(l+r)//2將數組分成兩個部分。判斷是否兩邊都有序:旋轉點在無序的那一邊

class Solution(object):def minArray(self, numbers):""":type numbers: List[int]:rtype: int"""n=len(numbers)if n==0:return Nonel,r=0,n-1while(l<r):mid=(l+r)//2if numbers[mid]>numbers[r]:  # 右邊無序,旋轉點在右邊,numbers[mid]比右端點都大,最小肯定不是它l=mid+1elif numbers[mid]<numbers[r]: # 右邊有序,最小可能是numbers[mid]r=midelse:r-=1return numbers[r]

10.面試題12-矩陣中的路徑

請設計一個函數,用來判斷在一個矩陣是否存在一條包含某字符串所有字符的路徑。路徑可以總矩陣的任意一個格子開始,每一步可以在矩陣中向左、向右、向上、向下移動一格。如果一條路徑經過了某一格子,那么該路徑不能再次進入該格子。

dfs遞歸遍歷。以每個位子開始,尋找該匹配的字符串。有一個visted矩陣用于記錄哪些格子已經遍歷過了:
保護現場和恢復現場的問題

class Solution(object):def exist(self, board, word):""":type board: List[List[str]]:type word: str:rtype: bool"""m=len(board)if m==0:return Falsen=len(board[0])visted=[]visted=[[False]*n for _ in range(m)]def dfs(string,i,j):if len(string)==1 and string[0]==board[i][j]:return Trueif string[0]==board[i][j]:visted[i][j]=Trueif i-1>-1 and visted[i-1][j]==False:if  dfs(string[1:],i-1,j):return Trueif i+1<m  and visted[i+1][j]==False:if dfs(string[1:],i+1,j):return Trueif j-1>-1 and visted[i][j-1]==False:if dfs(string[1:],i,j-1):return Trueif j+1<n and visted[i][j+1]==False:if dfs(string[1:],i,j+1):return Truevisted[i][j]=Falsereturn Falsefor i in range(m):for j in range(n):if dfs(word,i,j):return Truereturn False

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

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

相關文章

蟻群算法的一些東西

運行了三個TSP經典用例,基本符合要求。僅僅是一份按照蟻群算法的原理寫的代碼,沒有做任何優化。 // bigSearch.cpp : 定義控制臺應用程序的入口點。 // #include<iostream> #include<math.h> #include<time.h> using namespace std; //該程序是以…

leetcode101 對稱二叉樹

給定一個二叉樹&#xff0c;檢查它是否是鏡像對稱的。 例如&#xff0c;二叉樹 [1,2,2,3,4,4,3] 是對稱的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的: 1 / \ 2 2 \ \ 3 3 說明: 如果你可以運用遞歸和迭…

Linux內核OOM機制的詳細分析

Linux 內核有個機制叫OOM killer&#xff08;Out-Of-Memory killer&#xff09;&#xff0c;該機制會監控那些占用內存過大&#xff0c;尤其是瞬間很快消耗大量內存的進程&#xff0c;為了防止內存耗盡而內核會把該進程殺掉。典型的情況是&#xff1a;某天一臺機器突然ssh遠程登…

算法(18)-leetcode-劍指offer2

leetcode-劍指offer-211.面試題13-機器人的運動范圍-廣度優先搜索12.面試題14-1-剪繩子13.面試題14-2-剪繩子214.面試題16-二進制中1的個數-布萊恩克尼根15.面試題16-數值的整數次方-快速冪解析法16.面試題17-打印從1到最大的n位數17.面試題18-刪除鏈表的節點18.面試題19-正則匹…

rabbitmq技術的一些感悟(一)

Rabbitmq 初識rabbitmq RabbitMQ是流行的開源消息隊列系統,用erlang語言開發。RabbitMQ是AMQP(高級消息隊列協議)的標準實現。如果不熟悉AMQP,直接看RabbitMQ的文檔會比較困難。不過它也只有幾個關鍵概念,這里簡單介紹 幾個概念說明: Broker

leetcode21 合并兩個鏈表

將兩個有序鏈表合并為一個新的有序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 示例&#xff1a; 輸入&#xff1a;1->2->4, 1->3->4 輸出&#xff1a;1->1->2->3->4->4 思路&#xff1a;鏈表歸并。 /*** Definition for si…

rabbitmq技術的一些感悟(二)

上一節文章主要是說了一下rabbitmq的安裝以及搭建好環境的一些命令,以及常用的api調用,其實自從google被封掉之后,我之前收藏的很多技術連接都已經被禁止訪問了,這個是多么可悲的一件事情啊,說多了都是淚。 首先,我先寫一段消費者的模塊,建立連接,初始化amq以及銷毀連接…

算法(19)-leetcode-劍指offer3

leetcode-劍指offer-321.面試題22-鏈表中的倒數第k個節點22.面試題24-反轉鏈表23.面試題25-合并兩個排序鏈表-遞歸24.面試題26-樹的子結構25.面試題27-二叉樹的鏡像26.面試題28-對稱二叉樹27.面試題29-順時針打印矩陣28.面試題30-包含min函數的棧29.面試題31-棧的押入&#xff…

高效解析xml的總結,閑下來寫的

需要這么幾個庫&#xff0c;直接放在你的代碼工程里即可&#xff1a; #include "rapidxml.h" #include "rapidxml_utils.h" int ReBornBossConf::loadConf(const char* szFileName){ rapidxml::file<char> fdoc(szFileName); rapidxml::xml_docum…

leetcode35 插入的位置

給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 你可以假設數組中無重復元素。 思路&#xff1a;二分查找 public class Solution {public int searchInsert(i…

算法(20)-leetcode-劍指offer4

leetcode-劍指offer-433.面試題33-二叉搜索樹的后序遍歷序列34.面試題34-二叉樹中和為某一值的路徑35.面試題35-復雜鏈表的復制36.面試題36-二叉搜索樹與雙向鏈表37.面試題37-序列化二叉樹38.面試題38-字符串的排列39.面試題39-數組中出現次數超過一半的數字40.面試題40-最小的…

關于linux的進程中的各個線程cpu占用情況的分析和查看

我們經常會在新開的服搭建一個游戲的服務器,有時候要進行壓力測試,那么如何來看呢,一般我們會通過top命令查看各個進程的cpu和內存占用情況,獲得到了我們的進程id,然后我們也許會通過pstack命令查看里邊的各個線程id以及對應的線程現在正在做什么事情,分析多組數據就可以…

算法(21)-leetcode-劍指offer5

leetcode-劍指offer-443.面試題43-1&#xff5e;n整數中1出現的次數44.面試題44-數字序列中某一位的數字45.面試題45-把數組排成最小的數-快排變種46.面試題46-把數字翻譯成字符串47.面試題47-禮物的最大價值-dp48.面試題48-最長不含重復字符的子字符串-滑動窗口法49.面試題49-…

游戲中DDA算法和Bresenham算法的應用

在角色扮演或即時戰略游戲中,經常會將角色以最佳的方式走到指定地點。游戲場景的地面情況復雜,而且場面大,若采用盲目式搜索,例如盲目窮舉法,則幾乎要遍歷整個場景,效率非常低,造成角色反應速度過慢,實踐證明是一種不適合網絡游戲尋路方法。而啟發式搜索算法在障礙較少的情況下…

leetcode7 整數反轉

給出一個 32 位的有符號整數&#xff0c;你需要將這個整數中每位上的數字進行反轉。 示例 1: 輸入: 123 輸出: 321 示例 2: 輸入: -123 輸出: -321 示例 3: 輸入: 120 輸出: 21 注意: 假設我們的環境只能存儲得下 32 位的有符號整數&#xff0c;則其數值范圍為 [?231, …

關于蘋果purchase的驗證

用戶在購買蘋果的商品的過程如下:

算法(23)-leetcode-劍指offer7

leetcode-劍指offer-559.面試題59-隊列的最大值60.面試題64-求12...n61.面試題65-不用加減乘除做加法62.面試題66-構建乘積數組63.面試題68-1二叉樹搜索樹的最近公共祖先64.面試題68-2二叉樹的最近公共祖先65.面試題67-把字符串轉換成數字-自動機66.面試題20-表示數值的字符串-…

C/C++ 獲得公網ip地址和內網ip

獲得公網ip:bool getPublicIp(string& ip) {int sock;char **pptr = NULL;struct sockaddr_in destAddr;struct hostent *ptr = NULL;char destIP[128];sock = socket(AF_INET,SOCK_STREAM,0);if( -1 == sock ){perror("creat socket failed");return …

終于,我讀懂了所有Java集合——List篇

ArrayList 基于數組實現&#xff0c;無容量的限制。 在執行插入元素時可能要擴容&#xff0c;在刪除元素時并不會減小數組的容量&#xff0c;在查找元素時要遍歷數組&#xff0c;對于非null的元素采取equals的方式尋找。 是非線程安全的。 注意點&#xff1a; &#xff08…

關于長連接和短連接

短連接 連接->傳輸數據->關閉連接 HTTP是無狀態的,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。 也可以這樣說:短連接是指SOCKET連接后發送后接收完數據后馬上斷開連接。