32. 最長有效括號 給你一個只包含 '(' 和 ')' 的字符串,找出最長有效(格式正確且連續)括號子串的長度。 示例 1: 輸入:s = "(()" 輸出:2 解釋:最長有效括號子串是 "()" 示例 2: 輸入:s = ")()())" 輸出:4 解釋:最長有效括號子串是 "()()" 示例 3: 輸入:s = "" 輸出:0
題解:通過棧實現
?enumerate函數用于將一個可迭代的對象組合為一個索引序列,
?同時列出數據和數據下標。在這個例子中,i是索引,j是s中的元素。
class Solution:def longestValidParentheses(self, s):stack = [-1]res = 0for i,j in enumerate(s):"""enumerate函數用于將一個可迭代的對象組合為一個索引序列,同時列出數據和數據下標。在這個例子中,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. 在排序數組中查找元素的第一個和最后一個位置 給你一個按照非遞減順序排列的整數數組 nums,和一個目標值 target。 請你找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值 target,返回 [-1, -1]。 你必須設計并實現時間復雜度為 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]
題解:可以直接使用二分查找函數?bisect_left, bisect_right 很快解出,這倆個函數具體使用,
參見博客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
補充 二分查找手搓代碼,與之前總結的雙指針解法十分類似,望讀者進行區分掌握
l, r = 0, len(nums) - 1
while l <= r:mid = (l + r) // 2 # // 表示只要整數if nums[mid] == target:return midelif nums[mid] < target:l = mid + 1else:r = mid - 1