锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
2 #Runtime: 1083 ms (Beats 15.71%)
3 #Memory: 44.7 MB (Beats 32.83%)
4
5 class Solution:
6 def fullBloomFlowers(self, flowers: List[List[int]], people: List[int]) -> List[int]:
7 st = sorted(flowers, key=lambda x:x[0])
8 ed = sorted(flowers, key=lambda x:x[1])
9 ans = []
10 for x in people:
11 i = bisect_left(ed, x, key=lambda x:x[1])
12 j = bisect_right(st, x, key=lambda x:x[0])
13 ans.append(j - i)
14 return ans
]]>
2 #Runtime: 32 ms (Beats 61.2%)
3 #Memory: 14.5 MB (Beats 5.8%)
4
5 # """
6 # This is MountainArray's API interface.
7 # You should not implement it, or speculate about its implementation
8 # """
9 #class MountainArray(object):
10 # def get(self, index):
11 # """
12 # :type index: int
13 # :rtype int
14 # """
15 #
16 # def length(self):
17 # """
18 # :rtype int
19 # """
20
21 class Solution(object):
22 def findInMountainArray(self, target, mountain_arr):
23 """
24 :type target: integer
25 :type mountain_arr: MountainArray
26 :rtype: integer
27 """
28 def b_search(l, r, di):
29 while l < r:
30 mid = (l + r) // 2
31 if di == 0:
32 if mountain_arr.get(mid) < target:
33 l = mid + 1
34 else:
35 r = mid
36 else:
37 if mountain_arr.get(mid) > target:
38 l = mid + 1
39 else:
40 r = mid
41 return l
42
43 l, r = 0, mountain_arr.length() - 1
44 eps = 1e-6
45 while l < r:
46 mid = (l + r) // 2
47 midmid = (mid + r) // 2
48 if mountain_arr.get(mid) >= mountain_arr.get(midmid):
49 r = midmid
50 else:
51 l = mid + 1
52 idx = b_search(0, l, 0)
53 if mountain_arr.get(idx) == target:
54 return idx
55 idx = b_search(l + 1, mountain_arr.length() - 1, 1)
56 if mountain_arr.get(idx) == target:
57 return idx
58 return -1
]]>
#Runtime: 67 ms (Beats 6.68%)
#Memory: 14.4 MB (Beats 65.32%)
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
l = bisect.bisect_left(nums, target)
r = bisect.bisect_right(nums, target)
if l > r - 1:
return [-1, -1]
return [l, r - 1]
]]>
2 #Runtime: 71 ms (Beats 88.26%)
3 #Memory: 13.6 MB (Beats 61.50%)
4
5 class Solution(object):
6 def kWeakestRows(self, mat, k):
7 """
8 :type mat: List[List[int]]
9 :type k: int
10 :rtype: List[int]
11 """
12 def bi_sect(x):
13 l, r = 0, len(mat[0])
14 while l < r:
15 mid = (l + r) // 2
16 if mat[x][mid] == 1:
17 l = mid + 1
18 else:
19 r = mid
20 return l
21
22 hq = []
23 ans = []
24 for r in xrange(len(mat)):
25 p = bi_sect(r)
26 heapq.heappush(hq, (p, r))
27 for _ in xrange(k):
28 ans.append(heappop(hq)[1])
29 return ans
]]>
2 #Runtime: 831 ms (Beats 100%)
3 #Memory: 25.4 MB (Beats 100%)
4
5 class Solution(object):
6 def minimizeMax(self, nums, p):
7 """
8 :type nums: List[int]
9 :type p: int
10 :rtype: int
11 """
12 n = len(nums)
13 nums.sort()
14 l, r = 0, nums[-1] - nums[0]
15
16 def cal(dif):
17 nt = 0
18 i = 1
19 while i < len(nums):
20 if nums[i] - nums[i - 1] <= dif:
21 i += 1
22 nt += 1
23 i += 1
24 return nt
25
26 while l < r:
27 mid = (l + r) // 2
28 if cal(mid) >= p:
29 r = mid
30 else:
31 l = mid + 1
32 return l
]]>
2 #Runtime: 19 ms (Beats 92.37%)
3 #Memory: 13.5 MB (Beats 57.32%)
4
5 class Solution(object):
6 def search(self, nums, target):
7 """
8 :type nums: List[int]
9 :type target: int
10 :rtype: int
11 """
12 l, r = 0, len(nums) - 1
13 while l <= r:
14 mid = (l + r) // 2
15 if nums[mid] == target:
16 return mid
17 if nums[mid] >= nums[0]:
18 if nums[0] <= target and nums[mid] > target:
19 r = mid - 1
20 else:
21 l = mid + 1
22 else:
23 if nums[mid] < target and nums[-1] >= target:
24 l = mid + 1
25 else:
26 r = mid - 1
27 return -1
]]>
鏂規(guī)硶涓錛氬綋鎴愪竴涓?D閫掑鍚戦噺錛屼簩鍒嗭紝O(log(N*M))
Python瀹炵幇
2 #Runtime: 19 ms (Beats 97.2%)
3 #Memory: 13.6 MB (Beats 95.32%)
4
5 class Solution(object):
6 def searchMatrix(self, matrix, target):
7 """
8 :type matrix: List[List[int]]
9 :type target: int
10 :rtype: bool
11 """
12 l, r = 0, len(matrix[0]) * len(matrix) - 1
13 while l < r:
14 mid = (l + r) // 2
15 if matrix[mid // len(matrix[0])][mid % len(matrix[0])] < target:
16 l = mid + 1
17 else:
18 r = mid
19 return matrix[l // len(matrix[0])][l % len(matrix[0])] == target
鏂規(guī)硶浜岋細鍏堢‘瀹氬湪鍝竴琛岋紝鍐嶆壂鎻忚琛屾墍鏈夊垪錛孫(N+M)
C++瀹炵幇
2 //Runtime: 56 ms (Beats 16.15%)
3
4 class Solution {
5 public:
6 bool searchMatrix(vector<vector<int> > &matrix, int target) {
7 int n = matrix.size();
8 int m = matrix[0].size();
9 int i, j;
10 for(i = 0; i < n; ++i) {
11 if(matrix[i][0] > target) {
12 --i;
13 break;
14 }
15 if(i == n - 1) break;
16 }
17 if(i < 0) return false;
18 for(j = 0; j < m; ++j) {
19 if(matrix[i][j] == target) return true;
20 }
21 return false;
22 }
23 };
]]>
2 #Runtime: 2010 ms (Beats 33.33%)
3 #Memory: 25.1 MB (Beats 100%)
4
5 class Solution(object):
6 def maxRunTime(self, n, batteries):
7 """
8 :type n: int
9 :type batteries: List[int]
10 :rtype: int
11 """
12 l, r = 0, sum(batteries) // n + 1
13 while l <= r:
14 mid = (l + r) // 2
15 if sum(min(mid, b) for b in batteries) >= n * mid:
16 l = mid + 1
17 else:
18 r = mid - 1
19 return r
]]>
#Runtime: 2487 ms (Beats 90.91%)
#Memory: 25 MB (Beats 72.73%)
class Solution(object):
def minSpeedOnTime(self, dist, hour):
"""
:type dist: List[int]
:type hour: float
:rtype: int
"""
eps = 1e-6
l, r = 1, 1000000000
if hour <= len(dist) - 1:
return -1
while l < r:
mid = (l + r) // 2
t = 0
for x in dist[:-1]:
t += x // mid
if x % mid:
t += 1
t += 1.0 * dist[-1] / mid
if t <= hour:
r = mid
else:
l = mid + 1
return l
]]>
2 #Runtime: 537 ms (Beats 55.42%)
3 #Memory: 25.7 MB (Beats 90.39%)
4
5 class Solution(object):
6 def peakIndexInMountainArray(self, arr):
7 """
8 :type arr: List[int]
9 :rtype: int
10 """
11 l, r = 0, len(arr) - 1
12 while l < r:
13 mid = (l + r) // 2
14 if arr[mid] < arr[mid + 1]:
15 l = mid + 1
16 else:
17 r = mid
18 return r
]]>
2 #Runtime: 14 ms (Beats 83.42%)
3 #Memory: 13.2 MB (Beats 69.77%)
4
5 class Solution(object):
6 def myPow(self, x, n):
7 """
8 :type x: float
9 :type n: int
10 :rtype: float
11 """
12
13 def cal(x, n):
14 if n == 0:
15 return 1.0
16 if n % 2:
17 return cal(x * x, n // 2) * x
18 else:
19 return cal(x * x, n // 2)
20
21 if n < 0:
22 return 1.0 / cal(x, -n)
23 return cal(x, n)
]]>
2 #Runtime: 999 ms (Beats 60%)
3 #Memory: 133.9 MB (Beats 20%)
4
5 class Solution(object):
6 def maxValue(self, events, k):
7 """
8 :type events: List[List[int]]
9 :type k: int
10 :rtype: int
11 """
12 n = len(events)
13 events.sort(key=lambda x: x[0])
14 dp = [[-1] * n for _ in range(k + 1)]
15
16 def DFS(idx, cnt):
17 if cnt == 0 or idx == len(events):
18 return 0
19 if dp[cnt][idx] != -1:
20 return dp[cnt][idx]
21 dp[cnt][idx] = max(DFS(idx + 1, cnt), events[idx][2] + DFS(bsearch(events[idx][1]), cnt - 1))
22 return dp[cnt][idx]
23
24 def bsearch(x):
25 l, r = 0, len(events) - 1
26 while l <= r:
27 mid = (l + r + 1) // 2
28 if events[mid][0] <= x:
29 l = mid + 1
30 else:
31 r = mid - 1
32 return l
33
34 return DFS(0, k)
]]>
2 #Runtime: 241 ms (Beats 10.50%)
3 #Memory: 24.1 MB (Beats 5.56%)
4
5 class Solution(object):
6 def minSubArrayLen(self, target, nums):
7 """
8 :type target: int
9 :type nums: List[int]
10 :rtype: int
11 """
12 pre_sum = [0]
13 for i in range(0, len(nums)):
14 pre_sum.append(pre_sum[-1] + nums[i])
15 if pre_sum[-1] < target:
16 return 0
17 l, r = 1, len(pre_sum)
18 while l < r:
19 mid = (l + r) // 2
20 ok = False
21 for i in range(mid, len(pre_sum)):
22 if pre_sum[i] - pre_sum[i - mid] >= target:
23 ok = True
24 break
25 if ok:
26 r = mid
27 else:
28 l = mid + 1
29 return r
]]>
2 #Runtime: 3361 ms (Beats 85.71%)
3 #Memory: 39.9 MB (Beats 14.29%)
4
5 class Solution(object):
6 def latestDayToCross(self, row, col, cells):
7 """
8 :type row: int
9 :type col: int
10 :type cells: List[List[int]]
11 :rtype: int
12 """
13 d = [[0, 1], [0, -1], [-1, 0], [1, 0]]
14 def DFS(grid, r, c):
15 if 0 <= r < row and 0 <= c < col and grid[r][c] == 0:
16 if r == row - 1:
17 return True
18 grid[r][c] = -1
19 for x in d:
20 tr = r + x[0]
21 tc = c + x[1]
22 if DFS(grid, tr, tc):
23 return True
24 return False
25
26 def ok(x):
27 grid = [[0] * col for _ in range(row)]
28 for i in range(x):
29 grid[cells[i][0] - 1][cells[i][1] - 1] = 1
30 for i in range(col):
31 if grid[0][i] == 0 and DFS(grid, 0, i):
32 return True
33 return False
34
35 l = 1
36 r = len(cells)
37 while l < r:
38 mid = (l + r) // 2 + (l + r) % 2
39 if ok(mid):
40 l = mid
41 else:
42 r = mid - 1
43 return l
44
]]>
2 #Runtime: 748 ms (Beats 42.86%)
3 #Memory: 24.8 MB (Beats 71.43%)
4
5 class Solution(object):
6 def minCost(self, nums, cost):
7 """
8 :type nums: List[int]
9 :type cost: List[int]
10 :rtype: int
11 """
12 def cal(m):
13 t = 0
14 for i in range(len(nums)):
15 t += abs(nums[i] - m) * cost[i]
16 return t
17
18 l, r = nums[0], nums[0]
19 for i in nums:
20 l = min(l, i)
21 r = max(r, i)
22 print(l)
23 print(r)
24 ans = 0
25 while l < r:
26 mid = (l + r) // 2
27 cost1 = cal(mid)
28 cost2 = cal(mid + 1)
29 if cost1 > cost2:
30 l = mid + 1
31 ans = cost2
32 else:
33 r = mid
34 ans = cost1
35 return ans
]]>
2 #Runtime: 4197 ms (Beats 25%)
3 #Memory: 193.2 MB (Beats 25%)
4
5 class Solution(object):
6 def makeArrayIncreasing(self, arr1, arr2):
7 """
8 :type arr1: List[int]
9 :type arr2: List[int]
10 :rtype: int
11 """
12 n1 = len(arr1)
13 n2 = len(arr2)
14 arr2.sort()
15 dp = {}
16
17 def cal(i, j, pre):
18 if i == n1:
19 return 0
20 if (i, j, pre) in dp:
21 return dp[(i, j, pre)]
22 k = bisect.bisect_right(arr2[j:], pre) + j
23 if k == n2:
24 ans = float('inf')
25 else:
26 ans = cal(i + 1, k + 1, arr2[k]) + 1
27 if arr1[i] > pre:
28 ans = min(ans, cal(i + 1, j, arr1[i]))
29 dp[(i, j, pre)] = ans
30 return ans
31
32 ans = cal(0, 0, -float('inf'))
33 return ans if ans != float('inf') else -1
]]>
2 #Runtime: 706 ms (Beats 30.51%)
3 #Memory: 45.6 MB (Beats 66.10%)
4
5 class SnapshotArray(object):
6
7 def __init__(self, length):
8 """
9 :type length: int
10 """
11 self.cur_arr = [0] * length
12 self.his_arr = [[0] for _ in range(length)]
13 self.modifed_idx_list = set()
14 self.snap_id = 0
15 self.snap_id_arr = [[-1] for _ in range(length)]
16
17
18 def set(self, index, val):
19 """
20 :type index: int
21 :type val: int
22 :rtype: None
23 """
24 if self.his_arr[index][-1] == val:
25 if index in self.modifed_idx_list:
26 self.modifed_idx_list.remove(index)
27 return
28 self.cur_arr[index] = val
29 if index not in self.modifed_idx_list:
30 self.modifed_idx_list.add(index)
31
32
33 def snap(self):
34 """
35 :rtype: int
36 """
37 for i in self.modifed_idx_list:
38 self.snap_id_arr[i].append(self.snap_id)
39 self.his_arr[i].append(self.cur_arr[i])
40 self.modifed_idx_list.clear()
41 self.snap_id += 1
42 return self.snap_id - 1
43
44
45 def get(self, index, snap_id):
46 """
47 :type index: int
48 :type snap_id: int
49 :rtype: int
50 """
51 arr = self.snap_id_arr[index]
52 l, r = 1, len(arr)
53 while l < r:
54 mid = (l + r) // 2
55 if arr[mid] <= snap_id:
56 l = mid + 1
57 else:
58 r = mid
59 return self.his_arr[index][l - 1]
60
61
62
63 # Your SnapshotArray object will be instantiated and called as such:
64 # obj = SnapshotArray(length)
65 # obj.set(index,val)
66 # param_2 = obj.snap()
67 # param_3 = obj.get(index,snap_id)
]]>
鎵嬪啓浜屽垎錛?br />
2 #Runtime: 83 ms (Beats 49.15%)
3 #Memory: 15.2 MB (Beats 72.73%)
4
5 class Solution(object):
6 def nextGreatestLetter(self, letters, target):
7 """
8 :type letters: List[str]
9 :type target: str
10 :rtype: str
11 """
12 def b_search(ch):
13 l = 0
14 r = len(letters) - 1
15 while l < r:
16 mid = (l + r) // 2
17 if letters[mid] <= target:
18 l = mid + 1
19 else:
20 r = mid
21 return l
22 idx = b_search(target)
23
24 if letters[idx] > target:
25 return letters[idx]
26 return letters[0]
鐢╬ython鑷甫浜屽垎鍑芥暟錛?br />
2 #Runtime: 80 ms (Beats 66.76%)
3 #Memory: 15.2 MB (Beats 93.75%)
4
5 class Solution(object):
6 def nextGreatestLetter(self, letters, target):
7 """
8 :type letters: List[str]
9 :type target: str
10 :rtype: str
11 """
12 idx = bisect.bisect_right(letters, target)
13
14 if idx < len(letters):
15 return letters[idx]
16 return letters[0]
]]>
鎬濊礬涓錛氳涓父鏍囷紝璁板綍褰撳墠琛岄潪璐熸暟鏈夊嚑涓?br />
2 #Runtime: 95 ms (Beats 68.82%)
3 #Memory: 14.5 MB (Beats 73.12%)
4
5 class Solution(object):
6 def countNegatives(self, grid):
7 """
8 :type grid: List[List[int]]
9 :rtype: int
10 """
11 pos = len(grid[0])
12 ans = 0
13 for i in range(len(grid)):
14 for j in range(pos):
15 if grid[i][j] < 0:
16 pos = j
17 break
18 ans += len(grid[0]) - pos
19 return ans
鎬濊礬浜岋細姣忚浜屽垎姹備綅緗紙澶嶆潅搴︽洿浣庯紝浣嗚繖棰樻暟鎹及璁″緢姘達紝鎵浠ュ弽鑰屾參錛?br />
2 #Runtime: 102 ms (Beats 25.81%)
3 #Memory: 14.5 MB (Beats 40.86%)
4
5 class Solution(object):
6 def countNegatives(self, grid):
7 """
8 :type grid: List[List[int]]
9 :rtype: int
10 """
11 def b_search(i):
12 l = 0
13 r = len(grid[i])
14 while l < r:
15 mid = (l + r) // 2
16 if grid[i][mid] >= 0:
17 l = mid + 1
18 else:
19 r = mid
20 return l
21
22 ans = 0
23 for i in range(len(grid)):
24 ans += len(grid[0]) - b_search(i)
25 return ans
]]>
2 #Runtime: 1442 ms (Beats 33.33%)
3 #Memory: 32 MB (Beats 100%)
4
5 class Solution(object):
6 def longestObstacleCourseAtEachPosition(self, obstacles):
7 """
8 :type obstacles: List[int]
9 :rtype: List[int]
10 """
11 stk, ans = [], []
12 for i in obstacles:
13 j = bisect_right(stk, i)
14 if j == len(stk):
15 stk.append(i)
16 else:
17 stk[j] = i
18 ans.append(j + 1)
19 return ans
]]>
2 #Runtime: 1082 ms (Beats 100%)
3 #Memory: 37.5 MB (Beats 38.71%)
4
5 class Solution(object):
6 def successfulPairs(self, spells, potions, success):
7 """
8 :type spells: List[int]
9 :type potions: List[int]
10 :type success: int
11 :rtype: List[int]
12 """
13 potions.sort()
14 ans = []
15 for sp in spells:
16 ans.append(len(potions) - bisect_left(potions, ceil(1.0 * success / sp)))
17 return ans
]]>
2 #Runtime: 178 ms (Beats 94.20%)
3 #Memory: 14.8 MB (Beats 31.81%)
4
5 class Solution(object):
6 def search(self, nums, target):
7 """
8 :type nums: List[int]
9 :type target: int
10 :rtype: int
11 """
12 l = 0
13 r = len(nums)
14 while l < r:
15 mid = (l + r) // 2
16 if nums[mid] == target:
17 return mid
18 if nums[mid] < target:
19 l = mid + 1
20 else:
21 r = mid
22 return -1
]]>
2 #Runtime: 379 ms (Beats 80.86%)
3 #Memory: 14.7 MB (Beats 56.32%)
4
5 class Solution(object):
6 def minEatingSpeed(self, piles, h):
7 """
8 :type piles: List[int]
9 :type h: int
10 :rtype: int
11 """
12 l = 1
13 r = max(piles)
14 while l < r:
15 mid = (l + r) // 2
16 t = 0
17 for i in piles:
18 t += ceil(i*1.0 / mid)
19 if t > h:
20 l = mid + 1
21 else:
22 r = mid
23
24 return l
]]>
2 #Runtime: 2092 ms (Beats 65.38%)
3 #Memory: 24.8 MB (Beats 46.15%)
4
5 class Solution(object):
6 def minimumTime(self, time, totalTrips):
7 """
8 :type time: List[int]
9 :type totalTrips: int
10 :rtype: int
11 """
12 l = 0
13 r = totalTrips * time[0]
14 while l < r:
15 mid = (l + r) // 2
16 tr = 0
17 for i in time:
18 tr += mid // i
19 if tr < totalTrips:
20 l = mid + 1
21 else:
22 r = mid
23 return l
]]>
鍥犱負璐х墿鐨勪紶杈撴槸紜畾欏哄簭鐨勬墍浠ユ瘮杈冪畝鍗曪紝浜屽垎絳旀錛屾瘡嬈″垽鏂槸鍚﹁兘鍦╠ays澶╁唴榪愯緭瀹屽嵆鍙紝浜屽垎鐨勪笅闄愭槸weights鐨勬渶澶у鹼紝涓婇檺鏄痺eights涔嬪拰
2 #Runtime: 400 ms (Beats 51.78%)
3 #Memory: 15.4 MB (Beats 32.99%)
4
5 class Solution(object):
6 def shipWithinDays(self, weights, days):
7 """
8 :type weights: List[int]
9 :type days: int
10 :rtype: int
11 """
12 l = max(weights)
13 r = sum(weights)
14
15 def check(cap):
16 t = 1
17 c = 0
18 for wi in weights:
19 if c + wi > cap:
20 t += 1
21 c = 0
22 c += wi
23 if t <= days:
24 return True
25 return False
26
27
28 while l < r:
29 mid = (l + r) // 2
30 if check(mid):
31 r = mid
32 else:
33 l = mid + 1
34 return r
]]>
2 #Runtime: 134 ms (Beats 72.61%)
3 #Memory: 20.6 MB (Beats 26.56%)
4
5 class Solution(object):
6 def singleNonDuplicate(self, nums):
7 """
8 :type nums: List[int]
9 :rtype: int
10 """
11 l = 0
12 r = len(nums) - 1
13 while l < r:
14 mid = (l + r) // 2
15 if mid % 2:
16 mid -= 1
17 if nums[mid] == nums[mid + 1]:
18 l = mid + 2
19 else:
20 r = mid
21 return nums[l]
]]>
Python bisect搴撳嚱鏁扮増錛?br />
2 #Runtime: 33 ms (Beats 67.74%)
3 #Memory: 14.2 MB (Beats 31.43%)
4
5 class Solution(object):
6 def searchInsert(self, nums, target):
7 """
8 :type nums: List[int]
9 :type target: int
10 :rtype: int
11 """
12 return bisect.bisect_left(nums, target)
鎵嬪啓浜屽垎錛?br />
2 #Runtime: 32 ms (Beats 73.34%)
3 #Memory: 14.2 MB (Beats 60.52%)
4
5 class Solution(object):
6 def searchInsert(self, nums, target):
7 """
8 :type nums: List[int]
9 :type target: int
10 :rtype: int
11 """
12 for i in range(0, len(nums)):
13 if nums[i] == target:
14 return i
15 if nums[i] > target:
16 return i
17 return len(nums)
]]>
鐢╬ython鑷甫鍑芥暟
2 #Runtime: 86 ms (Beats 97.67%)
3 #Memory: 13.9 MB (Beats 29.7%)
4
5 class Solution(object):
6 def answerQueries(self, nums, queries):
7 """
8 :type nums: List[int]
9 :type queries: List[int]
10 :rtype: List[int]
11 """
12 nums.sort()
13 sums = [nums[0]]
14 for i in range(1, len(nums)):
15 sums.append(sums[-1] + nums[i])
16 ans = []
17 for q in queries:
18 ans.append(bisect_right(sums, q))
19 return ans
鎵嬪啓浜屽垎錛?br />
2 #Runtime: 93 ms (Beats 95.35%)
3 #Memory: 13.8 MB (Beats 56.98%)
4
5 class Solution(object):
6 def answerQueries(self, nums, queries):
7 """
8 :type nums: List[int]
9 :type queries: List[int]
10 :rtype: List[int]
11 """
12 nums.sort()
13 sums = [nums[0]]
14 for i in range(1, len(nums)):
15 sums.append(sums[-1] + nums[i])
16 ans = []
17 for q in queries:
18 l = 0
19 r = len(nums)
20 while l < r:
21 mid = (l + r) // 2
22 if sums[mid] > q:
23 r = mid
24 else:
25 l = mid + 1
26 ans.append(l)
27 return ans
]]>
2 #Runtime: 42 ms
3 #Memory Usage: 13.3 MB
4
5 # The guess API is already defined for you.
6 # @param num, your guess
7 # @return -1 if num is higher than the picked number
8 # 1 if num is lower than the picked number
9 # otherwise return 0
10 # def guess(num):
11
12 class Solution(object):
13 def guessNumber(self, n):
14 """
15 :type n: int
16 :rtype: int
17 """
18 l = 1
19 r = n
20 while l < r:
21 mid = (l + r) // 2
22 if guess(mid) == 1:
23 l = mid + 1
24 elif guess(mid) == 0:
25 return mid
26 else:
27 r = mid - 1
28 return l
]]>
鏂規(guī)硶涓錛氬厛DFS錛屼笉鏂蛋宸﹀瓙鏍戠殑璺緞錛岀畻鍑轟簩鍙夋爲灞傛暟max_depth錛岄偅涔堟渶鍚庝竴灞傝妭鐐圭殑鏁伴噺涓篬1, 2^(max_depth-1)]錛岀洿鎺ヤ簩鍒嗚繖涓寖鍥達紝鐒跺悗綆楀嚭鏈鍚庝竴涓彾瀛愮粨鐐硅惤鍦ㄥ摢閲岋紝鐞嗚澶嶆潅搴(logn)*O(logn)
2 #Runtime: 156 ms
3 #Memory Usage: 29.2 MB
4
5 # Definition for a binary tree node.
6 # class TreeNode(object):
7 # def __init__(self, val=0, left=None, right=None):
8 # self.val = val
9 # self.left = left
10 # self.right = right
11 class Solution(object):
12 def binarySearch(self, root, depth, mid, l, r):
13 if depth == self.max_depth - 1:
14 if root:
15 return True
16 return False
17 if mid <= (l + r)//2:
18 return self.binarySearch(root.left, depth + 1, mid, l, (l + r)//2)
19 else:
20 return self.binarySearch(root.right, depth + 1, mid, (l + r)//2, r)
21
22 def countNodes(self, root):
23 """
24 :type root: TreeNode
25 :rtype: int
26 """
27 self.max_depth = 0
28 rt = root
29 while rt:
30 rt = rt.left
31 self.max_depth = self.max_depth + 1
32 if not self.max_depth:
33 return 0
34 l = 1
35 r = 2**(self.max_depth - 1)
36 while l < r:
37 mid = (l + r) // 2 + (l + r) % 2
38 if self.binarySearch(root, 0, mid, 1, 2**(self.max_depth - 1)):
39 l = mid
40 else:
41 r = mid - 1
42 return l + 2**(self.max_depth - 1) - 1
鏂規(guī)硶浜岋細鐩存帴涓嶆柇浜屽垎鍦伴掑綊鎵懼乏鍙沖瓙鏍戯紝鐩村埌閬囧埌鏌愪釜婊′簩鍙夋爲鑺傜偣錛岀劧鍚巗um(宸﹀瓙鏍戠殑鎼滅儲緇撴灉)+sum(鍙沖瓙鏍戠殑鎼滅儲緇撴灉)+1錛堟牴緇撶偣錛夛紝鐞嗚澶嶆潅搴(logn)*O(logn)
2 #Runtime: 137 ms
3 #Memory Usage: 29.2 MB
4
5 # Definition for a binary tree node.
6 # class TreeNode(object):
7 # def __init__(self, val=0, left=None, right=None):
8 # self.val = val
9 # self.left = left
10 # self.right = right
11 class Solution(object):
12 def DFS(self, root, fg):
13 if not root:
14 return 1
15 if fg == 0:
16 return self.DFS(root.left, 0) + 1
17 return self.DFS(root.right, 1) + 1
18
19 def countNodes(self, root):
20 """
21 :type root: TreeNode
22 :rtype: int
23 """
24 if not root:
25 return 0
26 depth_l = self.DFS(root.left, 0)
27 depth_r = self.DFS(root.right, 1)
28 if depth_l == depth_r:
29 return 2**depth_l - 1
30 return self.countNodes(root.left) + self.countNodes(root.right) + 1
鏂規(guī)硶涓夛細鐩存帴DFS鏁存5鏍戞眰鑺傜偣鏁伴噺錛屽鏉傚害O(n)錛屾病鎯沖埌榪欎釜鏂規(guī)硶鍙嶈屾渶蹇?..
2 #Runtime: 87 ms
3 #Memory Usage: 29.4 MB
4
5 # Definition for a binary tree node.
6 # class TreeNode(object):
7 # def __init__(self, val=0, left=None, right=None):
8 # self.val = val
9 # self.left = left
10 # self.right = right
11 class Solution(object):
12 def DFS(self, root):
13 if not root:
14 return
15 self.ans += 1
16 self.DFS(root.left)
17 self.DFS(root.right)
18
19 def countNodes(self, root):
20 """
21 :type root: TreeNode
22 :rtype: int
23 """
24 self.ans = 0
25 self.DFS(root)
26 return self.ans
]]>