什么企業(yè)做網(wǎng)站網(wǎng)站點(diǎn)擊快速排名
32. 最長(zhǎng)有效括號(hào) 給你一個(gè)只包含 '(' 和 ')' 的字符串,找出最長(zhǎng)有效(格式正確且連續(xù))括號(hào)子串的長(zhǎng)度。 示例 1: 輸入:s = "(()" 輸出:2 解釋:最長(zhǎng)有效括號(hào)子串是 "()" 示例 2: 輸入:s = ")()())" 輸出:4 解釋:最長(zhǎng)有效括號(hào)子串是 "()()" 示例 3: 輸入:s = "" 輸出:0
題解:通過(guò)棧實(shí)現(xiàn)
?enumerate函數(shù)用于將一個(gè)可迭代的對(duì)象組合為一個(gè)索引序列,
?同時(shí)列出數(shù)據(jù)和數(shù)據(jù)下標(biāo)。在這個(gè)例子中,i是索引,j是s中的元素。
class Solution:def longestValidParentheses(self, s):stack = [-1]res = 0for i,j in enumerate(s):"""enumerate函數(shù)用于將一個(gè)可迭代的對(duì)象組合為一個(gè)索引序列,同時(shí)列出數(shù)據(jù)和數(shù)據(jù)下標(biāo)。在這個(gè)例子中,i是索引,j是s中的元素。"""if j == "(":stack.append(i)else:stack.pop()if not stack:stack.append(i)else:res = max(res,i - stack[-1])return res
34. 在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置 給你一個(gè)按照非遞減順序排列的整數(shù)數(shù)組 nums,和一個(gè)目標(biāo)值 target。 請(qǐng)你找出給定目標(biāo)值在數(shù)組中的開始位置和結(jié)束位置。 如果數(shù)組中不存在目標(biāo)值 target,返回 [-1, -1]。 你必須設(shè)計(jì)并實(shí)現(xiàn)時(shí)間復(fù)雜度為 O(log n) 的算法解決此問題。 示例 1: 輸入:nums = [5,7,7,8,8,10], target = 8 輸出:[3,4] 示例 2: 輸入:nums = [5,7,7,8,8,10], target = 6 輸出:[-1,-1] 示例 3: 輸入:nums = [], target = 0 輸出:[-1,-1]
題解:可以直接使用二分查找函數(shù)?bisect_left, bisect_right 很快解出,這倆個(gè)函數(shù)具體使用,
參見博客http://t.csdnimg.cn/0H7jg
class Solution(object):def searchRange(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""from bisect import bisect_left, bisect_rightif len(nums)==0:return [-1,-1]res = [-1,-1]left = bisect_left(nums,target)if left<len(nums) and nums[left]==target:res[0] = leftres[1] = bisect_right(nums,target)-1return res
補(bǔ)充 二分查找手搓代碼,與之前總結(jié)的雙指針解法十分類似,望讀者進(jìn)行區(qū)分掌握
l, r = 0, len(nums) - 1
while l <= r:mid = (l + r) // 2 # // 表示只要整數(shù)if nums[mid] == target:return midelif nums[mid] < target:l = mid + 1else:r = mid - 1