算法(18)-leetcode-劍指offer2

leetcode-劍指offer-2

  • 11.面試題13-機器人的運動范圍-廣度優先搜索
  • 12.面試題14-1-剪繩子
  • 13.面試題14-2-剪繩子2
  • 14.面試題16-二進制中1的個數-布萊恩·克尼根
  • 15.面試題16-數值的整數次方-快速冪解析法
  • 16.面試題17-打印從1到最大的n位數
  • 17.面試題18-刪除鏈表的節點
  • 18.面試題19-正則匹配-回溯
  • 19.面試題20-表示數值的字符串
  • 20.面試題21-調整數組的順序使得奇數位于偶數的前面-雙指針

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

編程語言為python

11.面試題13-機器人的運動范圍-廣度優先搜索

地上有一個m行n列的方格,從坐標[0,0]到坐標[m-1,n-1].一個機器人從坐標[0,0]開始移動,它每一次可以向左右上下移動一格,機器人不能進入行列坐標位數之和大于k的格子(k=18,機器人能夠進入方格[35,37],因為3+5+3+7=18)。請問機器人能夠達到多少個格子。–需要從左上角開始的連續的區域。當一個方向不可以走時,設置一個flag,如果當flag==3時,停止向下遍歷。

廣度優先搜索:將不能走的格子堪稱障礙物,這是一道搜索題,可以使用深度優先或廣度優先來解決。本題隱含條件要求從左上角到右下角的聯通集。(k=1,[10,0]是滿足可走條件,但是機器人首先到不了[9,0].)廣度優先遍歷先將(0,0)放入隊列,判讀是否可達,可達就將它右邊和下邊的格子(下一步備選可達點)坐標[0,1] 和[1,0]放入到隊列中,不斷判斷隊列備選可達的點是否可達。直至隊列為空。(如果一個點不可達,他的右邊下邊就不能從這個點出發達到,但可能可以從其他點出發得到)

class Solution(object):def movingCount(self, m, n, k):""":type m: int:type n: int:type k: int:rtype: int"""def is_available(i,j):sum_ij=0# 取出一個數字每位上的數while(i>0):mod=i%10sum_ij+=modi=(i-mod)/10while(j):mod=j%10sum_ij+=modj=(j-mod)/10if sum_ij<=k:return Trueelse:return Falseres=0que=[(0,0)]visted_dit={}while(que):i,j=que.pop(0)if 0<=i<m and 0<=j<n and is_available(i,j):if not visted_dit.get((i,j)): # 一些已經走過的點需要標記,避免重復遍歷visted_dit[(i,j)]=Trueres+=1que.append((i+1,j))que.append((i,j+1))   return res

12.面試題14-1-剪繩子

給你一根長度為n的繩子,請把繩子堅稱整數長度的m段(n,m都是整數),每段繩子的長度記為k[0],k[1],…,k[m-1]。請問k[0]k[1]…k[m-1]可能的最大乘積是多少。(2 <= n <= 58)
完全背包問題:繩子的長度是背包容量,每次剪掉一段,讓乘積最大嘛。
dp[i]表示長為i的繩子至少切了一次的最大乘積,則dp[i]的更新表達式為:dp[i]=max(dp[i],dp[j]*(i-j),j*(i-j))
dp[j]與j的區別:dp[j]至少剪過一次,j表示一次沒剪。

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""dp=[0]*(n+1)dp[1]=1for i in range(2,n+1): for j in range(1,i):# print("i:",i,"j:",j,"i-j:",i-j,"dp[j]:",dp[j],dp[j]*(i-j),j*(i-j))dp[i]=max(dp[i],dp[j]*(i-j),j*(i-j))print dpreturn dp[-1]

13.面試題14-2-剪繩子2

本題與上一題題目一致只是輸入數據n的范圍變大了,可能回造成大數越界的問題。之前的dp可能回造成超時或出錯。
(2 <= n <= 1000)
和上一題寫的一毛一樣,勉強過了,擊敗24.73%用戶。

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""dp=[0]*(n+1)dp[1]=1for i in range(2,n+1): for j in range(1,i):# print("i:",i,"j:",j,"i-j:",i-j,"dp[j]:",dp[j],dp[j]*(i-j),j*(i-j))dp[i]=max(dp[i],dp[j]*(i-j),j*(i-j))return dp[-1]%(10**9+7)

基于數學推到的方案
算術幾何均值不等式:
n1+n2+...+naa>=n1n2...naa\frac{n_1+n_2+...+n_a}{a}>=\sqrt[a]{n_1n_2...n_a}an1?+n2?+...+na??>=an1?n2?...na??
a個數字的算術平均值,大于等于,這a個數的幾何平均值。
a=2時:
n1+n22>=n1n22\frac{n_1+n_2}{2}>=\sqrt[2]{n_1n_2}2n1?+n2??>=2n1?n2??
右邊取得最大值的當且僅當n1=n2=,...,nan_1=n_2=,...,n_an1?=n2?=,...,na?
即可得到推論1:將繩子 以相等的長度 等分多段,得到的乘積最大。

將繩子按照長度x分成a段,n=axn=axn=ax,乘積最大為xax^axa(x和a都是變量).因為a=nxa=\frac{n}{x}a=xn?,即最大值為:
xa=xnx=[x1x]nx^a=x^{\frac{n}{x}}=[x^{\frac{1}{x}}]^nxa=xxn?=[xx1?]n
問題轉換為求上式子的最大值,對上式求導讓其為0,求得極大值點為e。因為切分長度必須為整數,比較x=2,x=3的大小。x=3時x1xx^{\frac{1}{x}}xx1?更大。
所以推論2為:將繩子盡量分為長度為3的多個等分段時,乘積最大。

綜上:
推論1說的是需要將繩子繩子分為k段,這k段的長度是等分時這個k段的乘積最大。
推論2說的是每段的長度最好是3,對應的等分方式乘積最大。

n的取整依據能不能被3整除,可以分為(n=3a+bn=3a+bn=3a+b)-確定的方法有貪心選擇的性質:
b=0:最大乘積3a3^a3a
b=1:前面切出的a段3中拿出一段來,和1湊成長度為4子段,切成22=4>13
b=2:最大值為3a?23^a*23a?2

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""if n<=3:return n-1       # 初始條件n=2 res=1; n=3,res = 2a,b=n//3,n%3res=0if b==0:res=3**aelif b==1:res=3**(a-1)*4else:res=3**(a)*2return res%(10**9+7)

14.面試題16-二進制中1的個數-布萊恩·克尼根

請實現一個函數,輸入一個整數,輸出該數二進制表示中 1 的個數。例如,把 9 表示成二進制是 1001,有 2 位是 1。因此,如果輸入 9,則該函數輸出 2。
(461.漢明距離:兩個數字二進制表示形式的對應位置不同的數目。–將兩個數據取異或,然后統計異或結果的個數)

布萊恩·克尼根算法:利用特定的比特位和算術運算符移除最右邊的1。
在這里插入圖片描述

class Solution(object):def hammingWeight(self, n):""":type n: int:rtype: int"""res=0while(n):res+=1n=n &(n-1)return res

15.面試題16-數值的整數次方-快速冪解析法

實現函數double Power(double base, int exponent),求base的exponent次方。不得使用庫函數,同時不需要考慮大數問題。

class Solution(object):def myPow(self, x, n):""":type x: float:type n: int:rtype: float"""res=1if  n<0:flag=-1n*=-1else:flag=1for i in range(n):res*=xreturn res if flag==1 else 1/res

291.304 最后執行輸入:0.00001,2147483647 ,報錯memotyError

參考思路:
快速冪解析法(二進制):略
快速冪解析法(二分):xnx^nxn可以轉換為以下兩種情況:
xn=(x2)n//2x^n=(x^2)^{n//2}xn=(x2)n//2 ,n為偶數
xn=x(x2)n//2x^n=x(x^2)^{n//2}xn=x(x2)n//2,n為奇數
可以通過以上操作,將冪從n降到n//2,不斷重復,直至冪將為0.
在這里插入圖片描述

class Solution(object):def myPow(self, x, n):""":type x: float:type n: int:rtype: float"""if x==0:return 0if n<0:x,n=1/x,-nres=1while(n):if n%2==1:    # n&1res*=xx*=xn=n//2   # n>>=1return res

16.面試題17-打印從1到最大的n位數

輸入數字 n,按順序打印出從 1 到最大的 n 位十進制數。比如輸入 3,則打印出 1、2、3 一直到最大的 3 位數 999。

也不是很明白考察的什么!!!

class Solution(object):def printNumbers(self, n):""":type n: int:rtype: List[int]"""l=10**nres=[]for i in range(1,l):res.append(i)return res

17.面試題18-刪除鏈表的節點

給定單向鏈表的頭指針和一個要刪除的節點的,定義一個函數刪除該節點。返回刪除后的鏈表的頭節點。
說明:題目保證鏈表中節點的值互不相同

刪除鏈表節點注意dummy節點技巧,避免需要刪除的節點是頭節點。

class Solution(object):def deleteNode(self, head, val):""":type head: ListNode:type val: int:rtype: ListNode"""dummy=ListNode(0)dummy.next=headpre_node=dummycurr_node =headwhile(curr_node):next_node=curr_node.nextif curr_node.val==val:pre_node.next=next_nodereturn dummy.nextpre_node=curr_nodecurr_node=next_nodereturn dummy.next

18.面試題19-正則匹配-回溯

請實現一個函數用來匹配包含’. ‘和’‘的正則表達式。模式中的字符’.‘表示任意一個字符,而’'表示它前面的字符可以出現任意次(含0次)。在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"abaca"匹配,但與"aa.a"和"ab*a"均不匹配。

回溯方法:如果沒有星號,問題就會很簡單–只需要從左往右檢查匹配串s是否能夠匹配模式串p中的每一字符。
當模式串中有星號時,我們需要檢查匹配串s中的不同后綴,判斷它們是否能匹配模式串中的剩余部分,回溯方法可以用來解決這一類問題。當模式串中的星號出現在pattern[1]的位置時,可以將問題更新為(1)s與pattern[2:]的匹配問題(2)s[1:]與pattern的匹配問題(s[0]與pattern[0]匹配,pattern[1]的星號可以復制patern前面的字符。)

class Solution(object):def isMatch(self, s, p):""":type s: str:type p: str:rtype: bool"""if not p:return not sfirst_match=bool(s) and  p[0] in {s[0],"."}if len(p)>=2 and p[1]=="*":return (self.isMatch(s,p[2:])) or (first_match and self.isMatch(s[1:],p))else:return first_match and self.isMatch(s[1:],p[1:])

19.面試題20-表示數值的字符串

請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示數值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
leetcode 65

參考思路:有限狀態機器DFA
有限狀態機可以先寫正則表達式,然后轉換成DFA/直接寫,大概率不是最簡的。
有限狀態機:對于每個狀態接收下一個字符,DFA能夠確定一條唯一的轉換路徑,簡單的表驅動的一些方法就能實現,只需要讀一遍輸入流。
真不會寫!!!

20.面試題21-調整數組的順序使得奇數位于偶數的前面-雙指針

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位于數組的前半部分,所有偶數位于數組的后半部分。
暴力法:時間超出限制:15/17

class Solution(object):def exchange(self, nums):""":type nums: List[int]:rtype: List[int]"""n=len(nums)flag=ni=0while(i<flag):if nums[i]%2==0:    for j in range(i,flag-1):nums[j],nums[j+1]=nums[j+1],nums[j]# print(i,j,j+1,nums)flag-=1 # 用于控制已經操作過的偶數,換完可能還是偶數else:i+=1return nums

不要逐個換,直接用右指針指向結尾

class Solution(object):def exchange(self, nums):""":type nums: List[int]:rtype: List[int]"""n=len(nums)flag=n-1i=0while(i<flag):if nums[i]%2==0:    nums[i],nums[flag]=nums[flag],nums[i]flag-=1 # 用于控制已經操作過的偶數,換完可能還是偶數else:i+=1return nums

注意點:換過之后的索引是不增加的。

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

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

相關文章

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連接后發送后接收完數據后馬上斷開連接。

C++(8)--數組array-長度固定

數組及常用算法1.數組基本概念2.一維數組2.1數組的定義2.2數組初始化2.3一維數組動態賦初值2.4一維數組應用實例2.5一維數組的排序算法2.6 一維數組元素的刪除和插入array3.二維數組3.1數組定義3.2二維數組的動態賦值《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》…

關于去蘋果服務器驗證充值的一些看法

前端時間看了下關于app充值驗證發送游戲金幣的好多帖子和文章,也總結了一下app校驗的php代碼:可以參考我的上一封博客: http://blog.csdn.net/pbymw8iwm/article/details/42167125 其中這個帖子回復的大神比較多:點擊打開鏈接 有些人認為拿蘋果的receptdata去驗證,通過返…

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

Stack 基于Vector實現&#xff0c;支持LIFO。 類聲明 public class Stack<E> extends Vector<E> {} push public E push(E item) {addElement(item);return item; } pop public synchronized E pop() {E obj;int len size();obj peek();removeElementAt(…

IAP-應用內購買流程

成為ios開發者最大的好處就是&#xff0c;你編寫的應用程序會有很多方式可以賺錢。比如&#xff0c;收費版&#xff0c;免費掛廣告版&#xff0c;還有就是程序內置購買。 程序內置購買會讓你愛不釋手&#xff0c;主要有以下原因&#xff1a; 除了程序本身的下載收費以外&#x…