leetcode 167周賽題解

2021-10-01 11:49:11 字數 4445 閱讀 5817

class solution 

return ans;

}};

class

solution

:def

getdecimalvalue

(self, head)

: ans =

0while head !=

none

: ans = ans*

2+ head.val

head = head.

next

return ans

class solution 

}return ans;

}};

class

solution

:def

sequentialdigits

(self, low, high)

: ans =

forlen

inrange(1

,10):

for start in

range(1

,10-len+1

):tmp =

0for num in

range

(start,

min(

10,start +

len)):

tmp = tmp *

10+ num

if tmp>= low and tmp <=high:

return ans

在乙個mxn矩陣裡找到乙個邊長最長的正方形之和小於乙個閾值。

首先,對矩陣預處理一下(容斥原理)實現 o(1) 求正方形之和 ,然後偷懶寫法可以o(n)列舉邊長,但o(n*m*min(n,m))的複雜度python版本過不了,但c++能過(),所以更優的做法是二分邊長,時間複雜度就變成o(n*m*log(min(n,m)))

看來leetcode 用 python 做題要更細緻的考慮時間複雜度…

c++ 版o(n*m*min(n,m))複雜度 332 ms

class solution 

int ans = 0;

for (int i = 1; i <= n; ++i)

for (int j = 1; j <= m; ++j)

return ans;

}};

c++ 版o(n*m*log(min(n,m)))複雜度 108 ms

class solution 

int ans = 0;

int l =0, r =min(n,m);

while(l<=r)}}

if(ok==1) l = k +1;

else r = k -1;

}return ans;

}};

python版o(n*m*log(min(n,m)))複雜度 1404 ms

class

solution

:def

maxsidelength

(self, mat, threshold)

: n, m =

len(mat)

,len

(mat[0]

)#print('n:', n , 'm:', m)

sum=[[

0]*(m+1)

for i in

range

(n+1)]

a =[[

0]*(m+1)

for i in

range

(n+1)]

for i in

range(1

,n+1):

for j in

range(1

,m+1):

a[i]

[j]= mat[i-1]

[j-1

]sum

[i][j]

=sum

[i-1

][j]

+sum

[i][j-1]

-sum

[i-1

][j-1]

+ a[i]

[j] ans =

0 l =

0; r =

min(n,m)

;while l <=r :

d =int(

(l+r)/2

) flag =

false

for i in

range

(d,n+1)

:for j in

range

(d,m+1)

:# for d in range(1,min(i+1 ,j+1)): # python如果不二分就會超時

num =

sum[i]

[j]-

sum[i-d]

[j]-

sum[i]

[j-d]

+sum

[i-d]

[j-d]

if num <= threshold:

ans =

max(ans, d)

flag =

true

if flag:

l = d +

1else

: r = d -

1return ans

有障礙的迷宮,給k次機會破除障礙的機會,問最少步數從(0,0)出發走到(n-1,m-1)。

多用乙個狀態記錄當前破除過幾次障礙的的廣搜(dfs),實際上由於廣搜的特點,第一次到達出口的步數就是最後的答案。

這裡有個插曲,資料的問題從(0,0)到(n-1,m-1),廣搜的四個方向的順序會影響程式的效率(最優先向下右),因為這個問題,python版本我tle了一發。

class solution 

node(int _x, int _y, int _k)

};int shortestpath(vector>& grid, int k)

else

step[0][0][0] = 0;

while(!q.empty())

int nxt[4][2] = ,,,};

for(int i=0;i<4;i++){

int nx = now.x + nxt[i][0];

int ny = now.y + nxt[i][1];

if(nx>=0&&nx=0&&nyclass

solution

:def

shortestpath

(self, grid, k)

: t =

0 vis =

set(

) n, m =

len(grid)

,len

(grid[0]

)if grid[0]

[0]==

1:q =[(

0,0,

0,1)

] vis.add((0

,0,1

))else

: q =[(

0,0,

0,0)

] vis.add((0

,0,0

))while t<

len(q)

: now = q[t]

t+=1if now[0]

== n -

1and now[1]

== m -1:

return now[2]

for step in[[

0,1]

,[1,

0],[

-1,0

],[0

,-1]

]:nx = now[0]

+ step[0]

ny = now[1]

+ step[1]

#print(nx,ny)if0

<= nx < n and

0<= ny< m:

nk = now[3]

+ grid[nx]

[ny]

if nk <= k:

if(nx, ny, nk)

notin vis:

#print(nx,ny,nk)

vis.add(

(nx, ny, nk)

)(nx, ny, now[2]

+1, nk)

)return

-1

LeetCode 167 兩數之和

給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。說明 返回的下標值 index1 和 index2 不是從零開始的。你可以假設每個輸入只對應唯一的答案,而且你不可以重複使...

leetcode 167 兩數求和

方法二.二分查詢 給定乙個已按照 公升序排列 的整數陣列 numbers 請你從陣列中找出兩個數滿足相加之和等於目標數 target 函式應該以長度為 2 的整數陣列的形式返回這兩個數的下標值。numbers 的下標 從 1 開始計數 所以答案陣列應當滿足 1 answer 0 answer 1 n...

LeetCode167 兩數之和II

1.題目描述 給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。說明 返回的下標值 index1 和 index2 不是從零開始的。你可以假設每個輸入只對應唯一的答案,而且...