首页 > 其他 > 详细

algorithm

时间:2019-09-30 19:55:44      阅读:93      评论:0      收藏:0      [点我收藏+]
#快排
class Solution(object):
    def swap(self,x,i,j):
        tmp,x[i] = x[i],x[j]
        x[j] = tmp

    def partitionSort(self,x,l,r):
        i,j = l,r
        key = l
        while True:
            while x[j] >= x[key] and j > l:j -= 1
            while x[i] <= x[key] and i < r:i += 1
            if i >= j:break
            self.swap(x,i,j)
        self.swap(x,j,key)
        return j

    def quickSort(self,x,l,r):
        if l >= r:return
        p = self.partitionSort(x,l,r)
        print(x)
        self.quickSort(x,l,p-1)
        self.quickSort(x,p+1,r)

x = [6,  1 , 2, 7,  9 , 3 , 4  ,5 ,10 , 8]
Solution().quickSort(x,0,len(x)-1)
print(x)
#堆排序
def heapSort(arr,n,i):
    miniest,l,r = i,2*i+1,2*i+2
    if l<n and arr[l] < arr[miniest]:
        miniest = l
    if r<n and arr[r] < arr[miniest]:
        miniest = r
    if miniest != i:
        arr[miniest],arr[i] = arr[i],arr[miniest]
        heapSort(arr,n,miniest)
def minHeapSort(arr):
    n = len(arr)
    for i in range(n-1,-1,-1):
        heapSort(arr,n,i)
    for i in range(n-1,0,-1):
        arr[i],arr[0] = arr[0],arr[i]
        heapSort(arr,i,0)

arr = [10,46,22,81,91,60,31,30,77,96,13,20,65,35,65]
minHeapSort(arr)
n = len(arr)
print("排序后")
for i in range(n):
    print("%d" % arr[i])
# KMP
def get_pnext(p):
    pnext, L = [0], len(p)
    for i in range(1, L):
        k = pnext[i - 1]
        while k | 0 and p[k] != p[i]: k = pnext[k - 1]
        if p[k] == p[i]:
            pnext.append(k + 1)
        else:
            pnext.append(0)
    return pnext


def strStr(s, p):
    """
    :type haystack: str
    :type needle: str
    :rtype: int
    """
    if not p: return 0
    Ls, Lp = len(s), len(p)
    if Ls < Lp: return -1
    i, j, pnext = 0, 0, get_pnext(p)
    print(pnext)
    while i < Ls and j < Lp:
        if s[i] == p[j]:
            i += 1
            j += 1
        elif j != 0:
            j = pnext[j - 1]
        else:
            i += 1
    if j == Lp:
        return i - Lp
    return -1

  

# 马拉车 寻找回文子串
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        s1 = ‘#‘.join(s)
        s1 = ‘#‘ + s1 + ‘#‘
        l1 = len(s1)
        r = [0] * l1
        for i in range(0, l1):
            if r[i] != 0:
                continue
            r[i] = 1
            for j in range(i - 1, -1, -1):
                delta = i - j
                tmp = i + delta
                if tmp == l1 or s1[j] != s1[tmp]:
                    break
                r[i] += 1
            for delta in range(1, r[i]):
                j = i - delta
                r2 = r[i] - delta
                if r[j] < r2:
                    r[i + delta] = r[j]
                if r[j] > r2:
                    r[i + delta] = r2
        max_r = max(r)
        index = r.index(max_r)
        return s1[index - max_r + 1:index + max_r - 1].replace(‘#‘, ‘‘)
‘‘‘
#动态规划版本
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        l = len(s)
        if l == 0:
            return ‘‘
        m = [[False for _ in range(l)] for _ in range(l)]
        index = 0
        max_l = 1
        for k in range(0,l):
            for i in range(l-k):
                j = i + k
                if (j-i<2 or m[i+1][j-1]) and s[i] == s[j]:
                    m[i][j] = True
                    if m[i][j] and j+1-i>max_l:
                        max_l = j+1-i
                        index = i
        return s[index:index+max_l]
    ‘‘‘

  

# 最大字段和
def maxSubSum(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    b, sub_sum = 0, float(‘-inf‘)
    for x in nums:
        if b > 0:
            b += x
        else:
            b = x
        if b > sub_sum: sub_sum = b
    return sub_sum

  

# 最小表示
class Solution(object):
    def minimumRepresentation(self, s):
        i,j,k,l = 0,1,0,len(s)
        while k<l and i<l and j<l:
            if s[(i+k)%l] == s[(j+k)%l]:
                k+=1
            else:
                if s[(i+k)%l]>s[(j+k)%l]:i=max(i+k+1,j+1)
                else:j=max(j+k+1,i+1)
                k=0
            print(i+str(i)+    j+str(j)+    k+str(k))
        return min(i,j)

 

algorithm

原文:https://www.cnblogs.com/yvlian/p/11613914.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!