算法-58题

215. 数组中的第K个最大元素

方法一:堆

import heapq
class Solution(object):
    def findKthLargest(self, nums, k):
        res=[]
        for num in nums:
            heapq.heappush(res,num)
            if len(res)>k:
                heapq.heappop(res)
        return res[0]

方法二:快排

class Solution(object):
    def quicksort(self,nums,left,right):
        i=random.randint(left,right)
        pivot=nums[i]
        nums[left],nums[i]=nums[i],nums[left]
        i,j=left+1,right
        while True:
            while i<=j and nums[i]<pivot:
                i+=1
            while i<=j and nums[j]>pivot:
                j-=1
            if i>=j:
                break
            nums[i],nums[j]=nums[j],nums[i]
            i+=1
            j-=1
        nums[left],nums[j]=nums[j],nums[left]
        return j
    def findKthLargest(self, nums, k):
        target_index=len(nums)-k
        left,right=0,len(nums)-1
        while True:
            idx=self.quicksort(nums,left,right)
            if idx==target_index:
                return nums[idx]
            elif idx<target_index:
                left=idx+1
            else:
                right=idx-1

56. 合并区间

class Solution(object):
    def merge(self, intervals):
        intervals=sorted(intervals,key=lambda x:x[0])
        left,right=intervals[0][0],intervals[0][1]
        res=[]
        for i,j in intervals:
            if right<i:
                res.append([left,right])
                left,right=i,j
            else:
                right=max(right,j)
        res.append([left,right])
        return res

33. 搜索旋转排序数组

class Solution(object):
    def search(self, nums, target):
        left,right=0,len(nums)-1

        while left<=right:
            mid=left+(right-left)//2
            if nums[mid]==target:
                return mid
            if nums[left]<=nums[mid]:
                if nums[left]<=target<nums[mid]:
                    right=mid-1
                else:
                    left=mid+1
            else:
                if nums[mid]<target<=nums[right]:
                    left=mid+1
                else:
                    right=mid-1
        return -1 

43. 字符串相乘

class Solution(object):
    def multiply(self, num1, num2):
        if num1=="0" or num2=="0":
            return "0"
        m,n=len(num1),len(num2)
        res=[0]*(m+n)
        for i in range(m-1,-1,-1):
            for j in range(n-1,-1,-1):
                mul=(ord(num1[i])-48)*(ord(num2[j])-48)
                p1,p2=i+j,i+j+1
                total=mul+res[p2]
                res[p1]+=total//10
                res[p2]=total%10
        for i in range(m+n):
            if res[i]!=0:
                return "".join([str(x) for x in res[i:]])

55. 跳跃游戏

class Solution(object):
    def canJump(self, nums):
        end=0
        for i,num in enumerate(nums):
            if end<i:
                return False
            end=max(end,num+i)
            if end>=len(nums)-1:
                return True

53. 最大子数组和

class Solution(object):
    def maxSubArray(self, nums):
        res=nums[0]
        cur_sum=nums[0]
        for i in range(1,len(nums)):
            if cur_sum+nums[i]<nums[i]:
                cur_sum=nums[i]
            else:
                cur_sum=cur_sum+nums[i]
            if cur_sum>res:
                res=cur_sum
        return res

695. 岛屿的最大面积

class Solution(object):
    def DFS(self,x,y,m,n,grid):
        if x>=0 and x<m and y<n and y>=0 and grid[x][y]==1:
            grid[x][y]=0
            self.cur_area+=1
            for i,j in self.dir:
                cur_x,cur_y=x+i,y+j
                self.DFS(cur_x,cur_y,m,n,grid)
    def maxAreaOfIsland(self, grid):
        self.dir=[[1,0],[-1,0],[0,1],[0,-1]]
        m,n=len(grid),len(grid[0])
        self.max_area=0
        self.cur_area=0
        for i in range(m):
            for j in range(n):
                if grid[i][j]==1:
                    self.DFS(i,j,m,n,grid)
                    self.max_area=max(self.max_area,self.cur_area)
                    self.cur_area=0
        return self.max_area

54. 螺旋矩阵

class Solution(object):
    def fun(self,x,y,m,n,matrix):
        for j in range(n-1):
            self.res.append(matrix[x][y+j])
        for i in range(m-1):
            self.res.append(matrix[x+i][y+n-1])
        for j in range(n-1):
            self.res.append(matrix[x+m-1][y+n-1-j])
        for i in range(m-1):
            self.res.append(matrix[x+m-1-i][y])
    def spiralOrder(self, matrix):
        m,n=len(matrix),len(matrix[0])
        x,y=0,0
        self.res=[]
        while m>1 and n>1:
            self.fun(x,y,m,n,matrix)
            x+=1
            y+=1
            m-=2
            n-=2
        while m==1:
            for j in range(n):
                self.res.append(matrix[x][y+j])
            return self.res
        while n==1:
            for i in range(m):
                self.res.append(matrix[x+i][y])
            return self.res
        return self.res

3. 无重复字符的最长子串

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        mp=[0]*128
        max_length=0
        left=0
        cur_length=0
        for right,c in enumerate(s):
            t=ord(c)
            mp[t]+=1
            if mp[t]==1:
                cur_length+=1
                max_length=max(cur_length,max_length)
            else:
                while mp[t]>1:
                    mp[ord(s[left])]-=1
                    left+=1
                cur_length=right-left+1
        return max_length

69. x 的平方根 

二分查找:若未查找到,right指向的是小于target的最大数字,left指向的是大于target的最小数字

right:x的平方根

left:插入位置

class Solution(object):
    def mySqrt(self, x):
        left,right=0,x
        while (left<=right):
            mid=left+(right-left)//2
            if mid<x//mid:
                left=mid+1
            elif mid>x//mid:
                right=mid-1
            else:
                return mid
        return right

206. 反转链表

class Solution(object):
    def reverseList(self, head):
        dummy=ListNode()
        while head:
            cur=head.next
            head.next=dummy.next
            dummy.next=head
            head=cur
        return dummy.next

48. 旋转图像

class Solution(object):
    def rotate(self, matrix):
        n=len(matrix)
        for i in range(n):
            for j in range(i,n):
                matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]
        for i in range(n):
            for j in range(n//2):
                matrix[i][j],matrix[i][n-1-j]=matrix[i][n-1-j],matrix[i][j]

264. 丑数 II

class Solution(object):
    def nthUglyNumber(self, n):
        res=[1]*n
        p2,p3,p5=0,0,0
        for i in range(1,n):
            next2=res[p2]*2
            next3=res[p3]*3
            next5=res[p5]*5
            next_ugly=min(next2,next3,next5)
            res[i]=next_ugly
            if next_ugly==next2:
                p2+=1
            if next_ugly==next3:
                p3+=1
            if next_ugly==next5:
                p5+=1
        return res[n-1]

143. 重排链表

class Solution(object):
    def reorderList(self, head):
        if not head.next:
            return head
        dummy=ListNode(next=head)
        slow,fast=dummy,head
        while fast and fast.next:
            fast=fast.next.next
            slow=slow.next
        fast=slow.next
        slow.next=None
        while fast:
            cur=fast.next
            fast.next=slow.next
            slow.next=fast
            fast=cur
        A=head
        B=slow.next
        slow.next=None
        tail=dummy
        while A and B:
            next_A,next_B=A.next,B.next
            tail.next=A
            A.next=B
            tail=B
            A,B=next_A,next_B
        return dummy.next

39. 组合总和

class Solution(object):
    def fun(self,candidates,target,ans,x):
        if target==0:
            self.res.append(ans[:])
            return 
        for i in range(x,len(candidates)):
            if target<candidates[i]:
                return 
            ans.append(candidates[i])
            self.fun(candidates,target-candidates[i],ans,i)
            ans.pop()
        
    def combinationSum(self, candidates, target):
        candidates=sorted(candidates)
        self.res=[]
        self.fun(candidates,target,[],0)
        return self.res

200. 岛屿数量

class Solution(object):
    def fun(self,candidates,target,ans,x):
        if target==0:
            self.res.append(ans[:])
            return 
        for i in range(x,len(candidates)):
            if target<candidates[i]:
                return 
            ans.append(candidates[i])
            self.fun(candidates,target-candidates[i],ans,i)
            ans.pop()
        
    def combinationSum(self, candidates, target):
        candidates=sorted(candidates)
        self.res=[]
        self.fun(candidates,target,[],0)
        return self.res

15. 三数之和

class Solution(object):
    def threeSum(self, nums):
        nums=sorted(nums)
        n=len(nums)
        res=[]
        for i in range(n-2):
            if nums[i]>0:
                break
            if i>0 and nums[i-1]==nums[i]:
                continue
            x,y=i+1,n-1
            target=0-nums[i]
            while x<y:
                a,b=nums[x],nums[y]
                if a+b<target:
                    x+=1
                elif a+b>target:
                    y-=1
                else:
                    res.append([nums[i],a,b])
                    while x<y and nums[x]==a:
                        x+=1
                    while x<y and nums[y]==b:
                        y-=1
        return res

46. 全排列

class Solution(object):
    def fun(self,nums,ans):
        if len(ans) == len(nums):
            self.res.append(ans[:])
            return
        for i in range(len(nums)):
            if self.flag[i]==0:
                self.flag[i]=1
                ans.append(nums[i])
                self.fun(nums,ans)
                self.flag[i]=0
                ans.pop()
    def permute(self, nums):
        self.res=[]
        n=len(nums)
        self.flag=[0]*n
        self.fun(nums,[])
        return self.res

169. 多数元素

class Solution(object):
    def majorityElement(self, nums):
        candidate=None
        count=0
        for num in nums:
            if count==0:
                candidate=num
            else:
                count+=1 if candidate==num else -1
        return candidate

107. 二叉树的层序遍历 II

from collections import deque
class Solution(object):
    def levelOrderBottom(self, root):
        if not root:
            return []
        dq=deque()
        dq.append(root)
        count=len(dq)
        res=[]
        ans=[]
        while dq:
            cur=dq.popleft()
            ans.append(cur.val)
            count-=1
            if cur.left:
                dq.append(cur.left)
            if cur.right:
                dq.append(cur.right)
            if count==0:
                res.append(ans)
                ans=[]
                count=len(dq)
        for i in range(len(res)//2):
            res[i],res[len(res)-1-i]= res[len(res)-1-i],res[i]
        return res

470. 用 Rand7() 实现 Rand10()

class Solution(object):
    def rand10(self):
        while True:
            a=rand7()
            b=rand7()
            num=(a-1)*7+b
            if num>40:
                continue
            return (num-1)%10+1

5. 最长回文子串

class Solution(object):
    def longestPalindrome(self, s):
        n=len(s)
        dp=[[False]*n for i in range(n)]
        start=0
        max_length=1
        for i in range(n):
            dp[i][i]=True
        for length in range(2,n+1):
            for i in range(n-length+1):
                j=i+length-1
                if s[i]==s[j] and (dp[i+1][j-1]==True or length==2):
                    dp[i][j]=True
                    if length>max_length:
                        max_length=length
                        start=i
        return s[start:start+max_length]

1288. 删除被覆盖区间

class Solution(object):
    def removeCoveredIntervals(self, intervals):
        if len(intervals)==0 or len(intervals)==1:
            return len(intervals)
        intervals = sorted(intervals, key=lambda x: (x[0], -x[1]))
        count=1
        left,right=intervals[0][0],intervals[0][1]
        for i in range(1,len(intervals)):
            if left<=intervals[i][0] and right>=intervals[i][1]:
                continue
            else:
                count+=1
                left,right=intervals[i][0],intervals[i][1]
        return count

4. 寻找两个正序数组的中位数

class Solution(object):
    def findK(self,nums1,nums2,k):
        if not nums1:
            return nums2[k-1]
        if not nums2:
            return nums1[k-1]
        if k==1:
            return min(nums1[0],nums2[0])
        x=len(nums1) if k//2>len(nums1) else k//2
        y=len(nums2) if k-k//2>len(nums2) else k-k//2
        if nums1[x-1]>nums2[y-1]:
            return self.findK(nums1,nums2[y:],k-y)
        else:
            return self.findK(nums1[x:],nums2,k-x)
    def findMedianSortedArrays(self, nums1, nums2):
        m,n=len(nums1),len(nums2)
        total=m+n
        if total%2==0:
            return (self.findK(nums1,nums2,total//2)+self.findK(nums1,nums2,total//2+1))/2.0
        return self.findK(nums1,nums2,total//2+1)

113. 路径总和 II

class Solution(object):
    def fun(self,node,targetSum,ans):
        if targetSum==0 and not node.left and not node.right:
            self.res.append(ans[:])
        if node.left:
            ans.append(node.left.val)
            self.fun(node.left,targetSum-node.left.val,ans)
            ans.pop()
        if node.right:
            ans.append(node.right.val)
            self.fun(node.right,targetSum-node.right.val,ans)
            ans.pop()

    def pathSum(self, root, targetSum):
        if not root:
            return []
        self.res=[]
        self.fun(root,targetSum-root.val,[root.val])
        return self.res

121. 买卖股票的最佳时机

class Solution(object):
    def maxProfit(self, prices):
        min_price=float("inf")
        profit=0
        for price in prices:
            min_price=min(min_price,price)
            profit=max(profit,price-min_price)
        return profit

40. 组合总和 II

class Solution(object):
    def fun(self,candidates,target,x,res):
        if target==0:
            self.res.append(res[:])
            return
        if x==len(candidates):
            return

        for i in range(x,len(candidates)):
            if candidates[i]>target:
                return
            if i > x and candidates[i] == candidates[i-1]:
                continue
            res.append(candidates[i])
            self.fun(candidates,target-candidates[i],i+1,res)
            res.pop()
    def combinationSum2(self, candidates, target):
        candidates=sorted(candidates)
        self.res=[]
        self.fun(candidates,target,0,[])
        return self.res

172. 阶乘后的零

class Solution(object):
    def trailingZeroes(self, n):
        ans=0
        while n:
            n//=5
            ans+=n
        return ans

912. 排序数组

class Solution(object):
    def merge(self,nums1,nums2):
        if not nums1:
            return nums2
        if not nums2:
            return nums1
        nums=[]
        i,j=0,0
        while i<len(nums1) and j<len(nums2):
            if nums1[i]<nums2[j]:
                nums.append(nums1[i])
                i+=1
            else:
                nums.append(nums2[j])
                j+=1
        while i<len(nums1):
            nums.append(nums1[i])
            i+=1
        while j<len(nums2):
            nums.append(nums2[j])
            j+=1
        return nums
    def sortArray(self, nums):
        if len(nums) <= 1:
            return nums
        mid=len(nums)//2
        nums1=self.sortArray(nums[:mid])
        nums2=self.sortArray(nums[mid:])
        return self.merge(nums1,nums2)

911 · 最大子数组之和为k

class Solution:
    """
    @param nums: an array
    @param k: a target value
    @return: the maximum length of a subarray that sums to k
    """
    def max_sub_array_len(self, nums, k):
        mp={0:-1}
        cur_sum=0
        max_len=0
        for i,num in enumerate(nums):
            cur_sum+=num
            if cur_sum not in mp:
                mp[cur_sum]=i
            if cur_sum-k in mp:
                max_len=max(max_len,i-mp[cur_sum-k])
        return max_len

845. 数组中的最长山脉

class Solution(object):
    def longestMountain(self, arr):
        max_len=0
        for i in range(1,len(arr)-1):
            if arr[i]>arr[i-1] and arr[i]>arr[i+1]:
                cur_len=1
                a,b=i,i
                while a>0 and arr[a]>arr[a-1]:
                    cur_len+=1
                    a=a-1
                while b<len(arr)-1 and arr[b]>arr[b+1]:
                    cur_len+=1
                    b=b+1
                max_len=max(max_len,cur_len)
        return max_len

10. 正则表达式匹配

class Solution(object):
    def isMatch(self, s, p):
        m,n=len(s),len(p)
        dp=[[False]*(n+1) for _ in range(m+1)]
        dp[0][0]=True
        for i in range(2,n+1):
            if p[i-1]=="*":
                dp[0][i]=dp[0][i-2]
        for i in range(1,m+1):
            for j in range(1,n+1):
                if p[j-1]!="*":
                    if p[j-1]=="." or p[j-1]==s[i-1]:
                        dp[i][j]=dp[i-1][j-1]
                else:
                    dp[i][j]=dp[i][j-2]
                    if p[j-2]=="." or p[j-2]==s[i-1]:
                        dp[i][j]=dp[i][j] or dp[i-1][j]
        return dp[m][n]

面试题 01.07. 旋转矩阵

class Solution(object):
    def rotate(self, matrix):
        n=len(matrix)
        for i in range(n):
            for j in range(i,n):
                matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]
        for i in range(n):
            for j in range(n//2):
                matrix[i][j],matrix[i][n-1-j]=matrix[i][n-1-j], matrix[i][j]
        return matrix

334. 递增的三元子序列

class Solution(object):
    def increasingTriplet(self, nums):
        first,second=float("inf"),float("inf")
        for num in nums:
            if num<=first:
                first=num
            elif num<=second:
                second=num
            else:
                return True
        return False

146. LRU 缓存

class Node():
    def __init__(self,key=0,value=0,per=None,next=None):
        self.key=key
        self.value=value
        self.per=per
        self.next=next
class LRUCache(object):

    def __init__(self, capacity):
        self.capacity=capacity
        self.full=0
        self.head=Node()
        self.tail=Node()
        self.head.next=self.tail
        self.tail.per=self.head
        self.mp={}
    def add_node(self,node):
        node.next=self.head.next
        node.per=self.head
        self.head.next.per=node
        self.head.next=node
    def remove_node(self,node):
        node.per.next=node.next
        node.next.per=node.per
    def remove_tail_node(self):
        node=self.tail.per
        self.remove_node(node)
        return node
    def add_head_node(self,node):
        self.remove_node(node)
        self.add_node(node)
    def get(self, key):
        if key in self.mp:
            node=self.mp[key]
            self.add_head_node(node)
            return self.mp[key].value
        return -1

    def put(self, key, value):
        if key in self.mp:
            node=self.mp[key]
            node.value=value
            self.add_head_node(node)
        else:
            node=Node(key=key,value=value)
            self.mp[key]=node
            if self.full==self.capacity:
                old_node=self.remove_tail_node()
                del self.mp[old_node.key]
                self.add_node(node)
            else:
                self.full+=1
                self.add_node(node)

# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)

179. 最大数

class Solution(object):
    def largestNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: str
        """
        nums=[str(num) for num in nums]
        for i in range(len(nums)):
            for j in range(len(nums)-1-i):
                if nums[j]+nums[j+1]<nums[j+1]+nums[j]:
                    nums[j],nums[j+1]= nums[j+1],nums[j]
        if nums[0]=="0":
            return "0"
        return "".join(nums)

128. 最长连续序列

class Solution(object):
    def longestConsecutive(self, nums):
        s=set()
        for num in nums:
            s.add(num)
        max_len=0
        for num in s:
            if num-1 in s:
                continue
            count=1
            x=num+1
            while x in s:
                count+=1
                x+=1
            max_len=max(max_len,count)
        return max_len

386. 字典序排数

class Solution(object):
    def lexicalOrder(self, n):
        res=[]
        def dfs(cur):
            if cur>n:
                return
            res.append(cur)
            for i in range(10):
                dfs(cur*10+i)
        for i in range(1,10):
            dfs(i)
        return res

8. 字符串转换整数 (atoi)

class Solution(object):
    def myAtoi(self, s):
        s=s.strip()
        if not s:
            return 0
        sign=1
        i=0
        if s[0]=="+":
            i=1
        elif s[0]=="-":
            i=1
            sign=-1
        INT_MAX=2**31-1
        INT_MIN=-2**31
        result=0
        while i<len(s) and s[i].isdigit():
            digit=ord(s[i])-48
            if result>(INT_MAX-digit)//10:
                return INT_MAX if sign == 1 else INT_MIN
            result=result*10+digit
            i+=1
        return result*sign

110. 平衡二叉树

class Solution(object):
    def deep(self,root):
        if root:
            a=self.deep(root.left)
            b=self.deep(root.right)
            return max(a,b)+1
        return 0
    def isBalanced(self, root):
        if root:
            a=self.deep(root.left)
            b=self.deep(root.right)
            if abs(a-b)>1:
                return False
            return self.isBalanced(root.right) and self.isBalanced(root.left)
        return True

多数组第 K 小数

class Solution:
    def findKthNum(self , arr1 , arr2 , target ):
        if len(arr1)==0:
            return arr2[target-1]
        if len(arr2)==0:
            return arr1[target-1]
        if target==1:
            return min(arr1[0],arr2[0])
        i=target//2 if len(arr1)>=target//2 else len(arr1)
        j=target-target//2 if len(arr2)>=target-target//2 else len(arr2)
        if arr1[i-1]<arr2[j-1]:
            return self.findKthNum(arr1[i:],arr2,target-i)
        else:
            return self.findKthNum(arr1 ,arr2[j:],target-j)

1004. 最大连续1的个数 III

class Solution(object):
    def longestOnes(self, nums, k):
        left=0
        max_length=0
        count=0
        for right,num in enumerate(nums):
            if num==0:
                count+=1
                if count>k:
                    while left<=right and count>k:
                        if nums[left]==0:
                            count-=1
                        left+=1
            max_length=max(max_length,right-left+1)
        return max_length

LCR 135. 报数

class Solution(object):
    def countNumbers(self, cnt):
        self.res=[]
        def dfs(x,length,ans):
            if x==length:
                self.res.append(int("".join(ans)))
                return
            start=1 if x==0 else 0
            for i in range(start,10):
                ans.append(str(i))
                dfs(x+1,length,ans)
                ans.pop()

        for length in range(1,cnt+1):
            dfs(0,length,[])
        return self.res

322. 零钱兑换

class Solution(object):
    def coinChange(self, coins, amount):
        dp=[float("inf")]*(amount+1)
        dp[0]=0
        for i in range(1,amount+1):
            for coin in coins:
                if i-coin<0:
                    continue
                dp[i]=min(dp[i],dp[i-coin]+1)
        return dp[amount] if dp[amount]!=float("inf") else -1

523. 连续的子数组和

class Solution(object):
    def checkSubarraySum(self, nums, k):
        mp={0:-1}
        cur_sum=0
        for i,num in enumerate(nums):
            cur_sum+=num
            if k!=0:
                ans=cur_sum%k
            else:
                ans=cur_sum
            if ans in mp :
                if i-mp[ans]>=2:
                    return True
            else:
                mp[ans]=i
        return False

151. 反转字符串中的单词

class Solution(object):
    def reverseWords(self, s):
        res=[]
        i=0
        while i<len(s):
            while i<len(s) and s[i]==" ":
                i+=1
            if i==len(s):
                break
            cur_s=""
            while i<len(s) and s[i]!=" ":
                cur_s+=s[i]
                i+=1
            res.append(cur_s)
        for i in range(len(res)//2):
            res[i],res[len(res)-i-1]=res[len(res)-i-1],res[i]
        return " ".join(res)

25. K 个一组翻转链表

class Solution(object):
    def reverseKGroup(self, head, k):
        length=0
        cur=head
        while cur:
            length+=1
            cur=cur.next
        group=length//k
        dummy=ListNode(next=head)
        a,b=dummy,head
        while group:
            x=k
            a.next=None
            tail=b
            while x:
                cur=b.next
                b.next=a.next
                a.next=b
                b=cur
                x-=1
            a=tail
            a.next=b
            group-=1
        return dummy.next

22. 括号生成

class Solution(object):
    def fun(self,left,right,ans):
        if left==0 and right==0:
            self.res.append("".join(ans[:]))
            return 
        if left !=0:
            ans.append('(')
            self.fun(left-1,right+1,ans)
            ans.pop()
        if right!=0:
            ans.append(')')
            self.fun(left,right-1,ans)
            ans.pop()
    def generateParenthesis(self, n):
        self.res=[]
        self.fun(n,0,[])
        return self.res

20. 有效的括号

class Solution(object):
    def isValid(self, s):
        stack=[]
        for c in s:
            if c=="(" or c=="{" or c=="[":
                stack.append(c)
            else:
                if len(stack)==0:
                    return False
                k=stack.pop()
                if c==")" and k!="(":
                    return False
                if c=="}" and k!="{":
                    return False
                if c=="]" and k!="[":
                    return False
        if len(stack)==0:
            return True
        return False

413. 等差数列划分

class Solution(object):
    def numberOfArithmeticSlices(self, nums):
        if len(nums)<=2:
            return 0
        total=0
        dp=0
        for i in range(2,len(nums)):
            if nums[i]-nums[i-1] ==nums[i-1]-nums[i-2]:
                dp+=1
                total+=dp
            else:
                dp=0
        return total

32. 最长有效括号

class Solution(object):
    def longestValidParentheses(self, s):
        stack=[-1]
        res=0
        for i,c in enumerate(s):
            if c==")":
                stack.pop()
                if stack:
                    res=max(res,i-stack[-1])
                else:
                    stack.append(i)
            else:
                stack.append(i)
        return res

735. 小行星碰撞

class Solution(object):
    def asteroidCollision(self, asteroids):
        i=0
        res=[]
        for a in asteroids:
            while res and res[-1]>=0 and a<0:
                diff=res[-1]+a
                if diff<0:
                    res.pop()
                elif diff==0:
                    res.pop()
                    a=0
                    break
                else:
                    a=0
                    break        
            if a:
                res.append(a)
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值