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 不是從零開始的。你可以假設每個輸入只對應唯一的答案,而且...