leetcode7

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值