Longest Valid Parentheses
昨天刚听了这道题的讲解,今天就做到了。。。有几个坑count存放的当前位置最长的有效子串,这个碰到的主要是当有效的子串到达了s[0],要判断一下。
#coding=utf-8
class Solution(object):
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
if s=='':
return 0
count=[]
coo=[]
for i in range(len(s)):
temp=0
j=0
if i==0:
count.append(0)
coo.append(i)
else:
if s[i]=='(':
count.append(0)
coo.append(i)
else:
if count[i-1]==0:
if s[i-1]=='(':
temp+=2
j=i-2
else:
if coo[i-1]-1>=0:
if s[coo[i-1]-1]=='(':
temp=count[i-1]+2
if coo[i-1]-2>=0:
j=coo[i-1]-2
else:
count.append(temp)
coo.append(0)
continue
else:
count.append(0)
coo.append(i)
continue
else:
count.append(0)
coo.append(i)
continue
if count[j]>0:
temp+=count[j]
count.append(temp)
coo.append(coo[j])
else:
count.append(temp)
coo.append(j+1)
return max(count)
Search in Rotated Sorted Array
题目有点没读懂 但还是作对了
python:
#coding=utf-8
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if nums==[]:
return -1
if target in nums:
return nums.index(target)
else:
return -1
c++: 用二分查找
int search(vector<int>& nums, int target) {
int lo = 0, hi = int(nums.size()) - 1;
while (lo < hi) {
int mid = (lo + hi) / 2;
if ((nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid]))
lo = mid + 1;
else
hi = mid;
}
return lo == hi && nums[lo] == target ? lo : -1;
}
python:
def search(self, nums, target):
lo, hi = 0, len(nums) - 1
while lo < hi:
mid = (lo + hi) / 2
if (nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid]):
lo = mid + 1
else:
hi = mid
return lo if target in nums[lo:lo+1] else -1
if (nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid])区分两个真的还是一个真的
class Solution:
# @param A, a list of integers
# @param target, an integer to be searched
# @return an integer
def search(self, A, target):
left = 0; right = len(A) - 1
while left <= right:
mid = (left + right) / 2
if target == A[mid]:
return mid
if A[mid] >= A[left]:
if target < A[mid] and target >= A[left]:
right = mid - 1
else:
left = mid + 1
elif A[mid] < A[right]:
if target > A[mid] and target <= A[right]:
left = mid + 1
else:
right = mid - 1
return -1
Search for a Range
又是二分查找的变形。因为题目要求的时间复杂度是O(log n)。在二分查找到元素时,需要向前和向后遍历来找到target元素的起点和终点
#coding=utf-8
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
lo=0;hi=len(nums)-1
while lo<hi:
mid=(lo+hi)/2
if nums[mid]>target:
hi=mid-1
elif nums[mid]<target:
lo=mid+1
else:
result=[0,0]
if nums[lo]==target:
result[0]=lo
if nums[hi]==target:
result[1]=hi
for i in range(mid,hi+1):
if nums[i]!=target:
result[1]=i-1
break
for i in range(mid,lo-1,-1):
if nums[i]!=target:
result[0]=i+1
break
return result
return [-1,-1]