Quicksort

class Sort:    def quickSort(self, arr):        self.quicksort_helper(arr, 0, len(arr)-1)        return arr    def quicksort_helper(self, arr, left, right):        if left < right:            pivot_final_resting_position = self.partition(arr, left, right)            self.quicksort_helper(arr, left, pivot_final_resting_position-1)            self.quicksort_helper(arr, pivot_final_resting_position+1, right)    def partition(self, arr, left, right):        pivot = arr[right]        i = left - 1        for j in range(left, right):            if arr[j] <= pivot:                i += 1                self.swap(arr, i, j)        self.swap(arr, i+1, right)        return i+1    def swap(self, arr, first, second):        temp = arr[first]        arr[first] = arr[second]        arr[second] = temp

Bubble Sort

class Sort:    def bubbleSort(self, nums):        for i in range(len(nums)-1, 0, -1):            for j in range(i):                if nums[j] > nums[i]:                    temp = nums[i]                    nums[i] = nums[j]                    nums[j] = temp        return nums

Merge Sort

class Sort:    def merge(self, left, right):        result = []        while len(left)>0 and len(right)>0:            if left[0] < right[0]:                result.append(left.pop(0))            else:                result.append(right.pop(0))        if left:            result.extend(left)        if right:            result.extend(right)        return result    def mergeSort(self, arr):        num = len(arr)        if num < 2:            return arr        middle = num // 2        left = arr[:middle]        right = arr[middle:]        left_sort = mergeSort(left)        right_sort = mergeSort(right)        return self.merge(left_sort, right_sort)

反转链表

# -*- coding:utf-8 -*-# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:    # 返回ListNode    def ReverseList(self, pHead):        # write code here        current = pHead        previous = None        while current:            temp = current.next            current.next = previous            previous = current            current = temp        return previous

判断链表是否有环

用current.next遍历,但凡遍历过的node都丢入head这一地址,若遍历过程中中next有==head的,阐明肯定连贯到先前node,阐明肯定有环。

# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = None## # @param head ListNode类 # @return bool布尔型#class Solution:    def hasCycle(self , head ):        # write code here        current = head        while current:            after = current.next            if after == head:                return True            current.next = head            current = after        return False

查看括号

## # @param s string字符串 # @return bool布尔型#class Solution:    def isValid(self , s ):        # write code here        length = len(s)        if length % 2 != 0:            return False        my_dict = {            "]":"[",            "}":"{",            ")":"("        }        my_list = []        for i in s:            if i not in my_dict:                my_list.append(i)            if i in my_dict:                if len(my_list) == 0:                    return False                correct = my_dict[i]                pop = my_list.pop()                if correct != pop:                    return False        if len(my_list) > 0:            return False                    return True                

股票,数组中的max(后-前)

动静布局

## # @param prices int整型一维数组 # @return int整型#class Solution:    def maxProfit(self , prices ):        # write code here        profit = 0        min_start = prices[0]        for i in range(1,len(prices)):            if prices[i] < min_start:                min_start = prices[i]            profit = max(profit, prices[i]-min_start)        return profit        

二分搜寻

## 代码中的类名、办法名、参数名曾经指定,请勿批改,间接返回办法规定的值即可## 如果目标值存在返回下标,否则返回 -1# @param nums int整型一维数组 # @param target int整型 # @return int整型#class Solution:    def search(self , nums , target ):        # write code here        low = 0        high = len(nums) - 1        while (low<=high):            middle = low + (high-low)//2            if nums[middle] == target:                while(middle>0 and nums[middle-1] == nums[middle]):                    middle-=1                return middle            elif nums[middle]>target:                high = middle - 1            else:                low = middle+1        return -1

镜像二叉树

递归

# class TreeNode:#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = None## 代码中的类名、办法名、参数名曾经指定,请勿批改,间接返回办法规定的值即可## # @param pRoot TreeNode类 # @return TreeNode类#class Solution:    def Mirror(self , pRoot ):        # write code here        if pRoot == None:            return pRoot        temp = pRoot.left        pRoot.left = pRoot.right        pRoot.right = temp        self.Mirror(pRoot.left)        self.Mirror(pRoot.right)        return pRoot

最长无反复子串

## # @param arr int整型一维数组 the array# @return int整型#class Solution:    def maxLength(self , arr ):        # write code here        my_dict = {}        max_len = 0        length = 0        start_ptr = 0        arr_len = len(arr)        if arr_len<=1:            return arr_len        for i in range(arr_len):            if arr[i] not in my_dict:                my_dict[arr[i]] = i                length += 1            else:                re_pos = my_dict[arr[i]]                max_len = max(max_len,length)                next_pos = re_pos+1                for j in range(start_ptr, next_pos):                    my_dict.pop(arr[j])                my_dict[arr[i]] = i                start_ptr = next_pos                length = i-re_pos        max_len = max(length, max_len)        return max_len        

缺失数字

依据题目意思,肯定从0开始,则用sum和-index和,若后果为零,list的最初一个元素+1;若后果不为零,list的最初一个元素-后果

## 找缺失数字# @param a int整型一维数组 给定的数字串# @return int整型#class Solution:    def solve(self , a ):        length = len(a)        sum1 = (0+len(a)-1)*length/2        sum2 = 0        for i in a:            sum2 = sum2+i        result = sum2-sum1        if result == 0:            return a[-1]+1        return (a[-1]-result)

Three Sum 找出所有不反复的和为零的三元数组

快排
排完后造成有序数组,左小右大,右边肯定为正数开始【否则不可能和为0】
间接排除:小于三个元素,sort后第一个元素大于0
基准从左开始,在正数范畴中搜寻
双指针,左指针指向基准后一个数,右指针指向最右数。若相加和<0,阐明过负,左指针向右挪动;若相加和>0,阐明过正,右指针向左挪动
如何确保不反复:建设duplicate_list,将有序的和为零的三元组转为string,每次append时先比拟是否in duplicate_list中

## # @param num int整型一维数组 # @return int整型二维数组#class Solution:    def threeSum(self , num ):        # write code here        num = self.quickSort(num)        length = len(num)        if length < 3 or num[0]>0:            return []        i = 0        dup = []        my_result = []        while i<length:            left = i+1            right = length-1            while (left<right):                result = num[i]+num[left]+num[right]                if result == 0:                    string = str(num[i])+str(num[left])+str(num[right])                    if (string not in dup):                        dup.append(string)                        my_result.append([num[i],num[left],num[right]])                    left += 1                    right -= 1                if (result<0):                    left += 1                if (result>0):                    right -= 1            i += 1        return my_result                def quickSort(self, arr):        self.quicksort_helper(arr, 0, len(arr)-1)        return arr    def quicksort_helper(self, arr, left, right):        if left < right:            pivot_pos = self.partition(arr, left, right)            self.quicksort_helper(arr, left, pivot_pos-1)            self.quicksort_helper(arr, pivot_pos+1, right)    def swap(self, arr, first, second):        temp = arr[first]        arr[first] = arr[second]        arr[second] = temp    def partition(self, arr, left, right):        pivot = arr[right]        i = left - 1        for j in range(left, right):            if arr[j] <= pivot:                i += 1                self.swap(arr, i, j)        self.swap(arr, i+1, right)        return i+1